捕捉WM_KEYDOWN消息的问题.(100分)

  • 主题发起人 主题发起人 rychu
  • 开始时间 开始时间
R

rychu

Unregistered / Unconfirmed
GUEST, unregistred user!

在BCB4中我从TCustomControl继承出一个控件,并对其WM_KEYDOWN,WM_KEYUP消息进行
捕捉.发现有一个问题比较有意思,百思不得其解.不知道那位高手知道其中缘由:
当我按下方向键的时候不能捕捉到WM_KEYDOWN却能捕捉到WM_KEYUP;后来发现TAB键的
也是这样的.

需要说的是,对于其他的,譬如字母和ALT键等等的键,都能同时捕捉到WM_KEYDOWN和
WM_KEYUP,说明我的程序基本上是没问题的吧.
 
我做了实验:结果除Alt ,PrintScreen sysRq,tab键行为特殊.
其他的都能响应WM_KEYDOWN和WM_KEYUP
[PrintScreen sysRq] [Alt] WM_KEYDOWN和WM_KEYUP 都不响应
[tab] WM_KEYDOWN不响应 ,WM_KEYUP 响应。
我们两的结果不一致!看看在说!

 
这个问题需要截获 WM_GETDLGCODE 消息,如下:
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
procedure TMyControl.WMGetDlgCode(var Message: TWMGetDlgCode);
begin
inherited;
Message.Result := Message.Result or DLGC_WANTTAB;
end;

WM_GETDLGCODE
The WM_GETDLGCODE message is sent to the dialog box procedure associated with a
control. Normally, Windows handles all arrow-key and TAB-key input to the control.
By responding to the WM_GETDLGCODE message, an application can take control of a
particular type of input and process the input itself.

下面是参数列表:
DLGC_BUTTON Button.
DLGC_DEFPUSHBUTTON Default push button.
DLGC_HASSETSEL EM_SETSEL messages.
DLGC_RADIOBUTTON Radio button.
DLGC_STATIC Static control.
DLGC_UNDEFPUSHBUTTON Nondefault push button.
<font color = #ff0000><strong>DLGC_WANTALLKEYS</font></strong> All keyboard input.
DLGC_WANTARROWS Direction keys.
DLGC_WANTCHARS WM_CHAR messages.
DLGC_WANTMESSAGE All keyboard input (the application passes this message on to a control).
DLGC_WANTTAB TAB key.

From: BaKuBaKu
 
多人接受答案了。
 
后退
顶部