如何知道键被按,鼠标移动,鼠标点击,而不管焦点是否在当前窗口(100分)

  • 主题发起人 主题发起人 董海滨
  • 开始时间 开始时间

董海滨

Unregistered / Unconfirmed
GUEST, unregistred user!
http://www.delphibbs.com/delphibbs/dispq.asp?lid=597873
不知道是否有点帮助
 
截取wm_mousemove消息
 
可是我不知道消息怎么用?
 
用鼠标勾子吧
WH_MOUSE
SetWindowsHookEx
MOUSEHOOKSTRUCT
看一下WINSDK的帮助就知道了
网上也有源码
 
搞定,把代码帖出来也许对别人有点帮助,但是那WM_MOUSEMOVE好象太神经质了一点,
鼠标动都没动也出问题!




var
Form1: TForm1;
g_hLogHook:HHOOK=0; //钩子变量
g_hLastFocus:HWnd=0; //记录上一次得到焦点的窗口句柄
g_TFocus:HWnd=0;
g_PrvChar:Char; //保存上一次按键值

implementation

{$R *.dfm}

function JournalLogProc(iCode:Integer;wParam:WPARAM;lParam:LPARAM): LRESULT stdcall;
var
color: TColor;
pEvt:^EVENTMSG;
hFocus, TFocus:HWND; //保存当前活动窗口句柄
szTitle:array[0..255]of Char; //当前窗口名称
classname : array[0..255] of Char;
szaTitle : array[0..255] of Char;
classaname : array[0..255] of Char;
vKey:Integer;
str:string;
Mouse1, Mouse2:String;
iShift:Integer;
iCapital:Integer;
iNumLock:Integer;
bShift:Boolean;
bCapital:Boolean;
bNumLock:Boolean;
begin
Result:=0;
if iCode<0 then
exit;
CallNextHookEx(g_hLogHook,iCode,wParam,lParam);
if iCode=HC_ACTION then
begin
pEvt:=Pointer(DWord(lParam));
if (pEvt.message=WM_MOUSEWHEEL) or (pEvt.message=WM_MOUSEMOVE) or
(pEvt.message=WM_LBUTTONDOWN) or (pEvt.message=WM_LBUTTONUP) or
(pEvt.message=WM_LBUTTONDBLCLK) or (pEvt.message=WM_RBUTTONDOWN) or
(pEvt.message=WM_RBUTTONUP) or (pEvt.message=WM_RBUTTONDBLCLK) or
(pEvt.message=WM_MBUTTONDOWN) or (pEvt.message=WM_MBUTTONUP) or
(pEvt.message=WM_MBUTTONDBLCLK) or (pEvt.message=WM_KEYDOWN) or
(pEvt.message=WM_KEYUP) OR (pEvt.message=260) then
begin FOrm1.HaveKeyPress:=true;FOrm1.Color:=ClBlack; end
else begin FOrm1.HaveKeyPress:=false;Form1.Color:=ClWhite; end;
end;
Result:=CallNextHookEx(g_hLogHook,iCode,wParam,lParam);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
if (g_hLogHook=0) then
g_hLogHook:=SetWindowsHookEx(WH_JOURNALRECORD, JournalLogProc,HInstance,0);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if (g_hLogHook<>0) then
begin
UnhookWindowsHookEx(g_hLogHook);
g_hLogHook:=0;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
FOrm1.HaveKeyPress:=false;
Form1.Color:=ClWhite;
end;

 
后退
顶部