首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

SetWindowLong (GWL_WNDPROC) 为何不能截获WM_KEYDOWN的VK_NEXT?该怎么解决

2012-03-08 
SetWindowLong (GWL_WNDPROC) 为何不能截获WM_KEYDOWN的VK_NEXT?Delphi(Pascal) code//先用这句设置处理过

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

Delphi(Pascal) code
//先用这句设置处理过程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;


[解决办法]
特殊按键是不会触发keydown消息的,要注册热键才能捕获,或者通过键盘驱动

热点排行