![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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; |