Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Ограничить движение курсора мыши, хук на мышь - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Ограничить движение курсора мыши, хук на мышь (Макросы/Sub)
Ограничить движение курсора мыши, хук на мышь
krosav4ig Дата: Пятница, 25.04.2014, 20:24 | Сообщение № 1
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
Вообщем задача такая: ограничить движение курсора при нажатии левой кнопкой мыши на определенном диапазоне границами этого диапазона. Все, что я смог сделать- это написать код для правой кнопки мыши. В примере диапазоны, в которых должен "запираться" курсор выделены зеленым цветом. Все уперлось в хук. Нужно чтобы при нажатии левой кнопки движение курсора ограничивалось границами соответствующего диапазона и при отпускании левой кнопки ограничение снималось.
К сообщению приложен файл: 4636463.xlsm (25.3 Kb)


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
СообщениеВообщем задача такая: ограничить движение курсора при нажатии левой кнопкой мыши на определенном диапазоне границами этого диапазона. Все, что я смог сделать- это написать код для правой кнопки мыши. В примере диапазоны, в которых должен "запираться" курсор выделены зеленым цветом. Все уперлось в хук. Нужно чтобы при нажатии левой кнопки движение курсора ограничивалось границами соответствующего диапазона и при отпускании левой кнопки ограничение снималось.

Автор - krosav4ig
Дата добавления - 25.04.2014 в 20:24
krosav4ig Дата: Воскресенье, 27.04.2014, 02:43 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
Нашел у себя в закромах библиотеку хука, написанную на delphi

[vba]
Код
library LowLevelMouseHook;

uses
       Windows,
       Messages;

const
       WH_MOUSE_LL = 14;
       MMFName: PChar = 'MMF';

type
       PGlobalDLLData = ^TGlobalDLLData;
       TGlobalDLLData = packed record
         WndHook: HWND;
         Wnd: HWND;
       end;

type
      TMouseHookFilters = record
        BlockMouseMove: boolean;
        BlockLeftButton: boolean;
        BlockRightButton: boolean;
        BlockMiddleButton: boolean;
        BlockWheel: boolean;
        end;

var
       GlobalData: PGlobalDLLData;
       MMFHandle: THandle;
       Filters: TMouseHookFilters;
       MWM_LBUTTONDOWN: Cardinal;
       MWM_LBUTTONUP: Cardinal;

function LowLevelMouseProc(Code: Integer; wParam: DWORD; lParam: DWORD): Longint; stdcall;
begin
       if (Code = HC_ACTION) then
       begin
         if (wParam =  WM_LBUTTONDOWN) then
         begin
           SendMessage(GlobalData.Wnd, MWM_LBUTTONDOWN, 0, 0);
           if Filters.BlockLeftButton = True then
             Result := - 1
           else
             Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
         end else
         if (wParam =  WM_LBUTTONUP) then
         begin
           SendMessage(GlobalData.Wnd, MWM_LBUTTONUP, 0, 0);
           if Filters.BlockLeftButton = True then
             Result := - 1
           else
             Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
         end
         else
           Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
       end;
end;

function StartMouseHook(State: Boolean; Wnd: HWND): Boolean; export; stdcall;
begin
       Result := False;
       if State = True then
       begin
         GlobalData^.WndHook := SetWindowsHookEx(WH_MOUSE_LL, @LowLevelMouseProc, hInstance, 0);
         GlobalData^.Wnd := Wnd;
         if GlobalData^.WndHook <> 0 then
           Result := True;
       end
       else
       begin
         UnhookWindowsHookEx(GlobalData^.WndHook);
         Result := False;
       end;
end;

function StopMouseHook(): Boolean; export; stdcall;
begin
       UnhookWindowsHookEx(GlobalData^.WndHook);
       if GlobalData^.WndHook = 0 then
         Result := False
       else
        Result := True;
end;

function UpdateMouseHook(HookFilters: TMouseHookFilters): Boolean; export; stdcall;
begin
       Filters := HookFilters;
end;

procedure OpenGlobalData();
begin
       MWM_LBUTTONDOWN := RegisterWindowMessage('MWM_LBUTTONDOWN');
       MWM_LBUTTONUP := RegisterWindowMessage('MWM_LBUTTONUP');
       MMFHandle := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
       GlobalData := MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
       if GlobalData = nil then
         CloseHandle(MMFHandle);
end;

procedure CloseGlobalData();
begin
       UnmapViewOfFile(GlobalData);
       CloseHandle(MMFHandle);
end;

procedure DLLEntryPoint(Reason: DWORD);
begin
       case Reason of
         DLL_PROCESS_ATTACH: OpenGlobalData;
         DLL_PROCESS_DETACH: CloseGlobalData;
       end;
end;

exports StartMouseHook, StopMouseHook, UpdateMouseHook;

begin
       DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
[/vba]

в самой программе в коде формы в разделе initialization
[vba]
Код

MWM_LBUTTONDOWN := RegisterWindowMessage('MWM_LBUTTONDOWN');
MWM_LBUTTONUP := RegisterWindowMessage('MWM_LBUTTONUP');
[/vba]

ловушка ставилась вызовом функи
[vba]
Код
     if StartMouseHook(true, Handle) = true then
              HookEnable := true;
[/vba]

и обработчик нажатия
[vba]
Код
procedure TForm1.WndProc(var Msg: TMessage)
{ отслеживаем нажатия левой кл. мыши } ;
begin
       inherited;
       if (Msg.Msg = MWM_LBUTTONDOWN{MWM_LBUTTONUP}) then
       begin
       ShowMessage('DOWN'{'UP'})
       end;
end;
[/vba]

можно ли это как-нить прикрутить к VBA?
К сообщению приложен файл: llmh.zip (16.1 Kb)


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Воскресенье, 27.04.2014, 02:59
 
Ответить
СообщениеНашел у себя в закромах библиотеку хука, написанную на delphi

[vba]
Код
library LowLevelMouseHook;

uses
       Windows,
       Messages;

const
       WH_MOUSE_LL = 14;
       MMFName: PChar = 'MMF';

type
       PGlobalDLLData = ^TGlobalDLLData;
       TGlobalDLLData = packed record
         WndHook: HWND;
         Wnd: HWND;
       end;

type
      TMouseHookFilters = record
        BlockMouseMove: boolean;
        BlockLeftButton: boolean;
        BlockRightButton: boolean;
        BlockMiddleButton: boolean;
        BlockWheel: boolean;
        end;

var
       GlobalData: PGlobalDLLData;
       MMFHandle: THandle;
       Filters: TMouseHookFilters;
       MWM_LBUTTONDOWN: Cardinal;
       MWM_LBUTTONUP: Cardinal;

function LowLevelMouseProc(Code: Integer; wParam: DWORD; lParam: DWORD): Longint; stdcall;
begin
       if (Code = HC_ACTION) then
       begin
         if (wParam =  WM_LBUTTONDOWN) then
         begin
           SendMessage(GlobalData.Wnd, MWM_LBUTTONDOWN, 0, 0);
           if Filters.BlockLeftButton = True then
             Result := - 1
           else
             Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
         end else
         if (wParam =  WM_LBUTTONUP) then
         begin
           SendMessage(GlobalData.Wnd, MWM_LBUTTONUP, 0, 0);
           if Filters.BlockLeftButton = True then
             Result := - 1
           else
             Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
         end
         else
           Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
       end;
end;

function StartMouseHook(State: Boolean; Wnd: HWND): Boolean; export; stdcall;
begin
       Result := False;
       if State = True then
       begin
         GlobalData^.WndHook := SetWindowsHookEx(WH_MOUSE_LL, @LowLevelMouseProc, hInstance, 0);
         GlobalData^.Wnd := Wnd;
         if GlobalData^.WndHook <> 0 then
           Result := True;
       end
       else
       begin
         UnhookWindowsHookEx(GlobalData^.WndHook);
         Result := False;
       end;
end;

function StopMouseHook(): Boolean; export; stdcall;
begin
       UnhookWindowsHookEx(GlobalData^.WndHook);
       if GlobalData^.WndHook = 0 then
         Result := False
       else
        Result := True;
end;

function UpdateMouseHook(HookFilters: TMouseHookFilters): Boolean; export; stdcall;
begin
       Filters := HookFilters;
end;

procedure OpenGlobalData();
begin
       MWM_LBUTTONDOWN := RegisterWindowMessage('MWM_LBUTTONDOWN');
       MWM_LBUTTONUP := RegisterWindowMessage('MWM_LBUTTONUP');
       MMFHandle := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
       GlobalData := MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
       if GlobalData = nil then
         CloseHandle(MMFHandle);
end;

procedure CloseGlobalData();
begin
       UnmapViewOfFile(GlobalData);
       CloseHandle(MMFHandle);
end;

procedure DLLEntryPoint(Reason: DWORD);
begin
       case Reason of
         DLL_PROCESS_ATTACH: OpenGlobalData;
         DLL_PROCESS_DETACH: CloseGlobalData;
       end;
end;

exports StartMouseHook, StopMouseHook, UpdateMouseHook;

begin
       DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
[/vba]

в самой программе в коде формы в разделе initialization
[vba]
Код

MWM_LBUTTONDOWN := RegisterWindowMessage('MWM_LBUTTONDOWN');
MWM_LBUTTONUP := RegisterWindowMessage('MWM_LBUTTONUP');
[/vba]

ловушка ставилась вызовом функи
[vba]
Код
     if StartMouseHook(true, Handle) = true then
              HookEnable := true;
[/vba]

и обработчик нажатия
[vba]
Код
procedure TForm1.WndProc(var Msg: TMessage)
{ отслеживаем нажатия левой кл. мыши } ;
begin
       inherited;
       if (Msg.Msg = MWM_LBUTTONDOWN{MWM_LBUTTONUP}) then
       begin
       ShowMessage('DOWN'{'UP'})
       end;
end;
[/vba]

можно ли это как-нить прикрутить к VBA?

Автор - krosav4ig
Дата добавления - 27.04.2014 в 02:43
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Ограничить движение курсора мыши, хук на мышь (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!