Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
1-75944
dimonf
2003-02-12 13:27
2003.02.24
Как на любой другой контрол перенаправить свойства окна?


14-76098
Случайный прохожий
2003-02-06 20:52
2003.02.24
WinSock


3-75751
denis24
2003-02-05 13:11
2003.02.24
выставление активного индекса


1-75999
nizar
2003-02-13 06:35
2003.02.24
Проверка на существование файла


14-76128
Cobalt
2003-02-06 21:35
2003.02.24
Что такое





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский