![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() Пробывал сделать так
Код:
public { Public declarations } id1, id2:Integer; procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY; end; procedure TForm1.WMHotKey(var Msg: TWMHotKey); var DC: HDC; cur:TPoint; begin if (Msg.HotKey = id1)or(Msg.HotKey = id2) then begin DC := CreateDC('MONITOR', nil, nil, nil); Windows.GetCursorPos(Cur); label8.Color:=GetPixel(DC, Cur.X, Cur.Y); DeleteDC(DC); end; end; procedure TForm1.FormCreate(Sender: TObject); begin id1 := GlobalAddAtom('Hotkey1'); RegisterHotKey(Handle, id1, 0, VK_MBUTTON); id2 := GlobalAddAtom('Hotkey2'); RegisterHotKey(Handle, id2, $12 + $10, $5A); end; procedure TForm1.FormDestroy(Sender: TObject); begin UnRegisterHotKey(Handle, id1); GlobalDeleteAtom(id1); UnRegisterHotKey(Handle, id2); GlobalDeleteAtom(id2); end; Цель: отловить нажатия клавиши не в зависимости где находится курсор мыши и не используя таймера. |
#2
|
||||
|
||||
![]() Похоже проще "мышиной" ловушкой
Код:
var MouseHook: HHOOK; function LowLevelMouseProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall; var DC: HDC; Cur: TPoint; begin Result:= CallNextHookEx(MouseHook, nCode, WParam, LParam); if WParam = WM_MBUTTONDOWN then begin DC:= CreateDC('MONITOR', nil, nil, nil); Windows.GetCursorPos(Cur); Form1.Label8.Color:= GetPixel(DC, Cur.X, Cur.Y); DeleteDC(DC); end; end; procedure TForm1.FormCreate(Sender: TObject); begin MouseHook:= SetWindowsHookEx(14 {для клавиатуры 13}, @LowLevelMouseProc, HInstance, 0); end; procedure TForm1.FormDestroy(Sender: TObject); begin UnhookWindowsHookEx(MouseHook); end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 05.07.2014 в 17:26. |
#3
|
|||
|
|||
![]() А если нужна использовать вместо средний кнопки мыши комбинацию клавишь
И вообще мне нужно общее событие которое будет происходить и при нажатии мышки и при нажатии клавиатуры Последний раз редактировалось Alexandr_17_10, 05.07.2014 в 19:18. |
#4
|
||||
|
||||
![]() На мышку мне установить хоткей так и не удалось ни разу, вешались лишь на клаву. Можно при срабатывании данной ловушки проверить состояние нужных клавиш с помощью GetKeyboardState, напр.
Код:
var KS : TKeyboardState; ... GetKeyboardState(KS); if Odd(KS[VK_CAPITAL]) then .. Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#5
|
|||
|
|||
![]() Мне нужно сделать одно действие если нажата комбинация клавишь alt+shift+z или если нажата средняя клавиша. Поэтому нужно общее событие которое срабатывает и при нажатии мышки и при нажатии клавы. Ну или если 1 вариант невозможен то 2 события 1 для мышки другое для клавы и в обоиъх запускать процедуру которая и получит цвет пикселя окна
|
#6
|
||||
|
||||
![]() У вас есть весь код для подобной реализации, но видимо проблема как раз в организации такого действа. Тогда вот, окончательная копипаста
Код:
procedure ptg; var DC: HDC; Cur: TPoint; begin DC:= CreateDC('MONITOR', nil, nil, nil); Windows.GetCursorPos(Cur); Form1.Label8.Color:= GetPixel(DC, Cur.X, Cur.Y); DeleteDC(DC); end; var MouseHook: HHOOK; function LowLevelMouseProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall; begin Result:= CallNextHookEx(MouseHook, nCode, WParam, LParam); if WParam = WM_MBUTTONDOWN then ptg; end; procedure TForm1.WMHotKey(var Message: TMessage); begin ptg; end; procedure TForm1.FormCreate(Sender: TObject); begin RegisterHotKey(form1.Handle,12345, MOD_ALT or MOD_SHIFT, $5A); MouseHook:= SetWindowsHookEx(14, @LowLevelMouseProc, HInstance, 0); end; procedure TForm1.FormDestroy(Sender: TObject); begin UnregisterHotKey(Handle, 12345); UnhookWindowsHookEx(MouseHook); end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |