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

Вниз

событие wm_KeyDown   Найти похожие ветки 

 
juiceman ©   (2004-04-16 22:38) [0]

Из справочника по сообщениям:
wm_KeyDown
Уведомляет окно с фокусом, что была нажата несистемная клавиша.

Пытаюсь обрабатывать это сообщение - ничего не получается. Код:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   ListBox1: TListBox;
 private
   { Private declarations }
 public
   { Public declarations }
 protected
   Procedure WMGetCommand(var Message : TMessage); message wm_KeyDown;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMGetCommand(var Message : TMessage);
Begin
 ListBox1.Items.Add("Нажата клавиша!");
end;

end.

Другие варианты просьба не предлагать, тут надо сделать именно так (предполагается отлов нажатий в чужом окне, причем через CallWndProc)


 
drpass ©   (2004-04-16 23:32) [1]

Оно уже и так обрабатывается средствами VCL


 
DVM ©   (2004-04-16 23:34) [2]

Оно приходит окну объекта Application, и он его передает другим окнам в другом виде.


 
Гаврила   (2004-04-16 23:49) [3]

Так ты про чужое окно говоришь-то, или про свое ?


 
Jack128 ©   (2004-04-16 23:49) [4]

Почему не работает так как ты написал:
Потому, что у тя на форме наверника есть другие wincontrol"ы, один из них имеет фокус, соответственно сообщение приходит к нему, а не к форме. Как надо делать? Form1.KeyPreview := True; и обрабатывать Form1.OnKeyDown почему это работает? смотрим исходники

function TWinControl.DoKeyDown(var Message: TWMKey): Boolean;
begin
...
Form := GetParentForm(Self);
if (Form <> nil) and (Form <> Self) and Form.KeyPreview and
   TWinControl(Form).DoKeyDown(Message)
then Exit;
...
end; вот если бы вместо TWinControl(Form).DoKeyDown(Message) посылалось бы сообщение wm_keydown ,то твой код работал бы..


 
juiceman ©   (2004-04-17 01:11) [5]

Растолковали очень подробно, спасибо. Но к чему я все это делал?
Есть некое приложение, события от клавиатуры в котором перехватывать не удается (ставлю глобальный хук). Подробнее можно прочитать в
Решил попробовать отлавливать хуком другого типа - WH_CALLWNDPROC. Вот код функции-фильтра:

function CallWndProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
var
 CWPS : ^CWPSTRUCT;
begin
if code >= 0 then
 begin
   CWPS:=Pointer(lParam);
   if CWPS^.message=WM_KeyDown then
     SendMessage(FindWindow("TForm1","Form1"),WM_USER+1, CWPS^.hwnd, 0);
 end;
 Result:= CallNextHookEx(H, Code, wParam, lParam);
end;

И ничего не отлавливалось, теперь понятно почему. Не понятно только что теперь делать :(


 
juiceman ©   (2004-04-17 01:13) [6]

Извините,
Подробнее можно прочитать в http://delphimaster.net/view/4-1081643815/



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

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

Наверх




Память: 0.48 MB
Время: 0.022 c
1-1084560173
Федя Мегатронов
2004-05-14 22:42
2004.05.30
Код исключения EidSockerError ???


4-1082097782
Zyb
2004-04-16 10:43
2004.05.30
Минимизация окна


14-1084436472
Undert
2004-05-13 12:21
2004.05.30
Правильно ли я понимаю,


3-1083833695
Михаил
2004-05-06 12:54
2004.05.30
Подстановочные поля


3-1083913177
Violina
2004-05-07 10:59
2004.05.30
BDE 5: параметр BLOB SIZE, dead BLOBs <> live BLOBs