Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.24;
Скачать: CL | DM;

Вниз

События клавиатуры   Найти похожие ветки 

 
izyum ©   (2002-12-20 14:52) [0]

Добрый день уважаемые Мастера!
Может кто знает, как отловить программно нажатие клавиши "Windows" самой по себе или какой либо клавиши в комбинации с "Windws". Отловить Контрол, Альт, Шифт - не проблема, а вот с Виндовс...

А вообще, может я даже не тем путем иду:), мне вообще-то надо эмулировать нажатие "Win"+М, то бишь свернуть все окна. Может можно как-то всем окнам разослать какое-то широковещательное сообщение?

Вообщем, может кто подскажет какое-то дельное решение


 
An_Life   (2002-12-20 16:54) [1]

Чтобы отслеживать события клавиатуры во всей Windows, нудно поставить ловушку (hook). Для этого нужно создать dll, в которой определить три функции: создание ловушки, обработка события нажатия на клавишу и уничтожение ловушки.
Это текст библиотеки (для ее создания выполните команду File | New, а в появившемся окне выберите dll).

library Key;
uses
WinTypes,
WinProcs,
Messages;

const
KeyEvent = WM_USER + 1;

var
HookHandle: hHook;

function KeyHook(Code: integer; WParam: word; LParam: Longint): Longint;
var
wnd: hWnd;
begin
if Code >= 0 then begin
wnd := FindWindow("TKeyForm", nil);
SendMessage(wnd, KeyEvent, wParam, lParam);
Result := 0;
end else
Result := CallNextHookEx(HookHandle, code, WParam, LParam);

end;

procedure SetKeyHook;
begin
HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyHook, HInstance, 0);
end;

procedure DelKeyHook;
begin
if HookHandle <> 0 then
UnhookWindowsHookEx(HookHandle);
end;

exports
SetKeyHook index 1,
KeyHook index 2,
DelKeyHook index 3;

begin
end.

Ниже приведен код самой программы. Очень важно назвать главное окно KeyForm – иначе ничего не будет работать.

unit KeyUn;

interface

uses WinTypes, Messages, Forms, SysUtils;
const
KeyEvent = WM_USER + 1;

type
TKeyForm = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
procedure WM_NextMSG(var Msg: TMessage); message KeyEvent;
public
hLib: THandle;
end;

var
KeyForm: TKeyForm;

implementation
{$R *.DFM}

function SetKeyHook: Longint; external "Key" index 1;
function KeyHook: Longint; external "Key" index 2;
function DelKeyHook: Longint; external "Key" index 3;


procedure TKeyForm.WM_NextMSG(var Msg: TMessage);
begin
beep;
end;

procedure TKeyForm.FormCreate(Sender: TObject);
begin
hLib := LoadLibrary("Key.dll");
SetKeyHook;
end;

procedure TKeyForm.FormDestroy(Sender: TObject);
begin
DelKeyHook;
FreeLibrary(hLib);
end;

end.
Это я нашел в одном хелпе(пробовал работает)


 
izyum ©   (2002-12-20 17:09) [2]

Спасибо, но это не совсем то, что нужно.
Мне нужно либо программно нажать комбинацию клавиш "Windows+M" либо разослать всем окнам сообщение, дабы оные минимизировались.
Другими словами, программно свернуть все имеющиеся окна.

А по ходу, интересно узнать, каким образом я могу отловить нажатия клавиши "Windows" в обработчике события OnKeyDoun, OnKeyUp.


 
An_Life   (2002-12-20 17:51) [3]

У меня где-то есть пример вызова Ctrl+Alt+Del но надо поискать:-)

а по поводу OnKeyDoun, OnKeyUp то можно код клавишы 91
пишыш это в OnKeyUp
if ord(Key) = 91 then
begin
<что душа пожелает>
end


 
Song ©   (2002-12-20 21:57) [4]

>>А вообще, может я даже не тем путем иду:), мне вообще-то надо эмулировать нажатие "Win"+М, то бишь свернуть все окна.
Для этого хук не надо. Для этого нужна EnumWindows()

>>Может можно как-то всем окнам разослать какое-то широковещательное сообщение?
Да, можно и широковещательное. Только ты скажи ты точно уверен, что хочешь послать широковещательное сообщение? :-) Если уверен, тогда я напишу как. Только потом ко мне никаких претензий..


 
Юрий Зотов ©   (2002-12-21 02:20) [5]

> Song © (20.12.02 21:57)

Думаю, эффект понравится. :о)

Только нужно на всякий случай предупредить, чтобы человек крепче за стул держался. Во избежание падений и травматизма.

Зато сразу поймет, почему эта ОС так странно называется...


 
Юрий Зотов ©   (2002-12-21 02:25) [6]

> An_Life (20.12.02 16:54)

А хук-то написан с принципиальной ошибкой. Sorry, но это так. Очень советую прочитать статью Алексея Павлова на этом сайте.


 
izyum ©   (2002-12-23 10:43) [7]

> Song © (20.12.02 21:57)
> Юрий Зотов © (21.12.02 02:20)

Проблему я уже свою решил, но хотелось бы высказать пару слов для Уважаемых мастеров. Ребята, я понимаю, что Вас от знаний просто прет:), но огромная просьба, если есть что сказать по теме - говорите, а фразы типа "крепче за стул держался" и "Только ты скажи ты точно уверен, что хочешь послать широковещательное сообщение" - это по моему для конференции "Потрепаться". А вобщем-то, всем спасибо.


 
Dm9 ©   (2002-12-24 15:52) [8]

Фак - "Малоизвестные команды Windows 9xx для запуска из командной строки (управление с помощью rundll32) "

Попробуй выполнить
"rundll32 user,tilechildwindows"

Но только не в НТ


 
Юрий Зотов ©   (2002-12-24 23:42) [9]

> izyum © (23.12.02 10:43)

А зря. Это не было тем, о чем Вы подумали. Я бы все же посоветовал послать HWND_BROADCAST - просто для эксперимента. Это действительно сразу и очень наглядно проясняет многие вещи.

А за стул все же лучше держаться. По себе знаю, да и не только по себе.
:о)



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

Текущий архив: 2003.02.24;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
7-76206
Sokol
2002-12-24 02:16
2003.02.24
Zapretiti zapusk prilojenii


14-76161
swordent
2003-02-07 22:31
2003.02.24
Помогите чловеку


7-76197
tornovsk
2002-12-23 19:51
2003.02.24
UNIX programming


3-75813
sav00
2003-02-05 21:33
2003.02.24
Как проиндексировать таблицу?


3-75834
Explorer
2003-02-05 09:10
2003.02.24
Запрос в ADOQuery