Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];

Вниз

Отслеживание клавиатуры   Найти похожие ветки 

 
Galiaf ©   (2006-04-12 20:55) [0]

Вот мне надо, чтобы моя программа висела сибе в поцессах и ничего не далала, а при нажатии комбинации клавиш (во всей системе), например ctrl+shift+c, она должна выполнять свою работу.
Делал я следующим образом:
сделал dll-ку в которой несколько процедурок:
- создание хука
 HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyHook, HInstance, 0);
- удаление хука
 if HookHandle <> 0 then
   UnhookWindowsHookEx(HookHandle);
- и собственно отслеживание клавиатуры и посылание сообщения своей пограмме
function KeyHook(Code: integer; WParam: word; LParam: Longint): Longint;
var
 wnd: hWnd;
begin
 if Code >= 0 then begin
   wnd := FindWindow("TUniClock", nil);
   SendMessage(wnd, KeyEvent, wParam, lParam);
   Result := 0;
 end else
   Result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;

И в самой программе подключаю библиотеку, создаю хук, принимаю сообщения и ondestroy удаляю хук.

procedure TUniClock.WM_NextMSG(var Msg: TMessage);
begin
with msg do
 case wParam of
   $58,  $78: If (hiword(GetKeyState(vk_lshift))<>0) then beep
 end
end;
это то чем ловлю сообщения, $58,  $78 - это как я понимаю X и x, Конечно это не работает (если бы работало, я бы не спрашивал), при нажатии на клавиши с зажатым alt-ом появляется звук хотя по идее он должен быть только по нажатию на Shift+x. Что тут не правильно? Или как сделать по-другому?


 
Leonid Troyanovsky ©   (2006-04-12 21:37) [1]


> Galiaf ©   (12.04.06 20:55)  

> Вот мне надо, чтобы моя программа висела сибе в поцессах
> и ничего не далала, а при нажатии комбинации клавиш (во
> всей системе), например ctrl+shift+c, она должна выполнять
> свою работу.


RTFM: RegisterHotKey.

Regards, LVT,


 
Galiaf ©   (2006-04-13 23:30) [2]

Мне это ни о чём не говорит. По-конкретнее. Если думаешь, что программа - некая падлянка, уверяю это не так.


 
Handle   (2006-04-14 09:45) [3]

private
   procedure WMHotkey( var msg: TWMHotkey ); message WM_HOTKEY;
 public
   { Public declarations }
 end;

procedure TForm1.WMHotkey( var msg: TWMHotkey );
begin

...

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
if not RegisterHotkey(Handle, 1, MOD_ALT , VK_F9) then
 Beep;
 ShowMessage("Unable to assign Alt-F9 as hotkey.");
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnRegisterHotkey( Handle, 1 );
end;


 
elen   (2006-04-14 11:08) [4]

Как мне превратить скен код полученный таким хуком в нормальную клавишу


 
Игорь Шевченко ©   (2006-04-14 13:00) [5]


> Как мне превратить скен код полученный таким хуком в нормальную
> клавишу


MapVirtualKey(Ex)


 
Woolen ©   (2006-04-15 15:09) [6]


> elen   (14.04.06 11:08) [4]
> Как мне превратить скен код полученный таким хуком в нормальную
> клавишу

ToAsciiEx
ToUnicode
ToUnicodeEx
И вышеуказанные
MapVirtualKey
MapVirtualKeyEx
Есть из чего выбирать под конкретную задачу. Я последний раз пользовался ToAsciiEx.


 
Galiaf ©   (2006-04-16 20:22) [7]

Что-то я не могу полностью понять, как вот это правильно использовать. Можно сделать пример с использованием комбинации ctrl+shift+c? У меня с этим получилось тоже самое что и в моём варианте.


 
Leonid Troyanovsky ©   (2006-04-16 20:55) [8]


> Galiaf ©   (16.04.06 20:22) [7]

> Что-то я не могу полностью понять, как вот это правильно
> использовать. Можно сделать пример с использованием комбинации
> ctrl+shift+c? У меня с этим получилось тоже самое


А чем тебе не понравился пример [3] by Peter Below?
И что конкретно не получилось?

Могу снабдить более полным его текстом:

http://groups.google.com/group/fido7.ru.delphi.chainik/msg/0c2d0a9b7d129cc8

--
Regards, LVT.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.009 c
2-1152789449
alexandrine
2006-07-13 15:17
2006.08.06
Need help


9-1132748546
Sco
2005-11-23 15:22
2006.08.06
Значения glFrustum


4-1145337676
DIR3ct0r
2006-04-18 09:21
2006.08.06
Определение сезона (зима/лето) по дате


6-1143034305
Kacnep
2006-03-22 16:31
2006.08.06
Виснет при TidServerSocket.Active:=false; Инди 10


6-1143027284
Dysan
2006-03-22 14:34
2006.08.06
длина строки с параметрами в TidHttp





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский