SetWindowLong (GWL_WNDPROC) 为何不能截获WM_KEYDOWN的VK_NEXT?

rslxy 2011-09-04 08:42:30

//先用这句设置处理过程
SetWindowLong (FHandle, GWL_WNDPROC, LongWord (@NewWndCallBack));

//实际的处理过程在这里实现
procedure TStockDrawBaseObject.ProcessMessage(
var Message: TMessage; var Result: integer);
var Rect: TRect;
ch: Char;
index: integer;
bResult: boolean;
Brush :HBRUSH;
parentHWND :HWND;
begin
Case message.Msg of
WM_PAINT:
begin
Paint (TWMPaint (Message), result);
end;

WM_ERASEBKGND:
begin
self.EraseBkgnd(TWMEraseBkgnd(Message), result);
end;

WM_LBUTTONDOWN:
begin
DoLButtonDown (TWMLButtonDown (Message));
end;

WM_LBUTTONUP:
begin
DoLButtonUp (TWMLButtonUp (Message));
end;

WM_LBUTTONDBLCLK:
begin
DoLButtonDblClk ( TWMLButtonDblClk (Message));
end;

WM_MOUSEWHEEL:
begin

bResult := Result <> 0;
DoMouseWheel (self, TCMMouseWheel(Message).ShiftState,
TCMMouseWheel(Message).WheelDelta,
SmallPointToPoint(TCMMouseWheel(Message).Pos), bResult);
if bResult then
result := 1
else
result := 0;
end;

WM_MOUSEMOVE:
begin
DoMouseMove (TWMMouseMove(Message));
end;

WM_CHAR, WM_SYSCHAR:
begin
DoChar (TWMChar (Message));
end;

//其他消息捕获成功,这里普通的键也成功,VK_NEXT VK_PRIOR等几个特殊键不能捕获
WM_KEYDOWN, WM_SYSKEYDOWN:
begin
DoKeyDown(TWMKeyDown (Message));
end;

end;

if Assigned (FStockDrawOnMessage) then
FStockDrawOnMessage (FHandle, Message, result);

if self.FManager <> nil then
FManager.ProcessMessage(FHandle, Message, result);
end;
...全文
368 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
funxu 2011-09-05
  • 打赏
  • 举报
回复
实际上有些特殊热键注册热键也无法使用的,例如f12等
李_军 2011-09-05
  • 打赏
  • 举报
回复
特殊按键是不会触发keydown消息的,要注册热键才能捕获,或者通过键盘驱动
rslxy 2011-09-04
  • 打赏
  • 举报
回复
没有人知道吗

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧