Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

События клавиатуры


izyum ©   (2002-12-20 14:52:00) 

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

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

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


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

> izyum © (23.12.02 10:43)

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

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


Dm9   (2002-12-24 15:52:00) [2]

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

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

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


izyum   (2002-12-23 10:43:00) [3]

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

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


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

> An_Life (20.12.02 16:54)

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


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

> Song © (20.12.02 21:57)

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

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

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


Song   (2002-12-20 21:57:00) [6]

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

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


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

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

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


izyum   (2002-12-20 17:09:00) [8]

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

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


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

Чтобы отслеживать события клавиатуры во всей 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.
Это я нашел в одном хелпе(пробовал работает)


Наверх

Титульная страница Поиск, карта сайта Написать письмо