Форум: "Система";
Текущий архив: 2003.02.24;
Скачать: [xml.tar.bz2];
ВнизСобытия клавиатуры Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c