Текущий архив: 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.47 MB
Время: 0.04 c