Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.07.2014, 12:59
Alexandr_17_10 Alexandr_17_10 вне форума
Прохожий
 
Регистрация: 17.06.2014
Сообщения: 27
Версия Delphi: Delphi 7, XE6
Репутация: 10
По умолчанию Отловить нажатия клавиш мыши, клавиатуры через winapi

Пробывал сделать так
Код:
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  
Старый 05.07.2014, 16:51
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Похоже проще "мышиной" ловушкой
Код:
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  
Старый 05.07.2014, 18:53
Alexandr_17_10 Alexandr_17_10 вне форума
Прохожий
 
Регистрация: 17.06.2014
Сообщения: 27
Версия Delphi: Delphi 7, XE6
Репутация: 10
По умолчанию

А если нужна использовать вместо средний кнопки мыши комбинацию клавишь
И вообще мне нужно общее событие которое будет происходить и при нажатии мышки и при нажатии клавиатуры

Последний раз редактировалось Alexandr_17_10, 05.07.2014 в 19:18.
Ответить с цитированием
  #4  
Старый 05.07.2014, 19:48
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

На мышку мне установить хоткей так и не удалось ни разу, вешались лишь на клаву. Можно при срабатывании данной ловушки проверить состояние нужных клавиш с помощью GetKeyboardState, напр.
Код:
var
KS : TKeyboardState;
...
GetKeyboardState(KS);
if Odd(KS[VK_CAPITAL]) then ..
т.е. получится что если вместе с мышкой нажата и VK_CAPITAL на клаве, нужно сделать то-то и то-то
Ответить с цитированием
  #5  
Старый 08.07.2014, 20:03
Alexandr_17_10 Alexandr_17_10 вне форума
Прохожий
 
Регистрация: 17.06.2014
Сообщения: 27
Версия Delphi: Delphi 7, XE6
Репутация: 10
По умолчанию

Мне нужно сделать одно действие если нажата комбинация клавишь alt+shift+z или если нажата средняя клавиша. Поэтому нужно общее событие которое срабатывает и при нажатии мышки и при нажатии клавы. Ну или если 1 вариант невозможен то 2 события 1 для мышки другое для клавы и в обоиъх запускать процедуру которая и получит цвет пикселя окна
Ответить с цитированием
  #6  
Старый 09.07.2014, 05:16
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

У вас есть весь код для подобной реализации, но видимо проблема как раз в организации такого действа. Тогда вот, окончательная копипаста
Код:
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;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:28.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025