100分啊!求监视某个应用程序中的所有键盘按键,Win系统高手快来!(100分)

  • 主题发起人 主题发起人 YFeral
  • 开始时间 开始时间
Y

YFeral

Unregistered / Unconfirmed
GUEST, unregistred user!
我想搞一个程序,构思如下:
在Win2000Pro中监视一个应用程序,捕获操作系统向它发送的所有键盘消息。
注意监视的应用程序可以该变,不过每次只监视一个。
 
思路是用全局键盘钩子 + FindWindow() + GetActiveWindow()
用FindWindow() + GetActiveWindow()判断当前活动程序是否是要监视的程序
用键盘钩子判断按键。

全局键盘钩子的例子:http://service.lonetear.com/delphi/dispdoc.asp?id=23
 
同意!全局钩子要做成DLL
 
谢谢两位的参与,我认为FindWindow( )功能太单调,只能利用窗口的标题文字去判断。
这样功能实在有限,有没有更好的办法?
本人正在做,欢迎各位高手指点!
 
FindWindow(类名,窗口名),如果窗口的标题文字会不断改变,还可以根据类名判断,类名是
不会变的,你先用Spy++看一下他的类名就可以了。
 
to zw84611:
你好,谢谢建议。你有Spy++吗?给我网址也可。
 
Spy++在VisualStudio的光盘里。其实你如果只想得到类名,用下面的代码单独写一个小程序
就可以了:

procedure TForm1.Timer1Timer(Sender: TObject);
var
p:TPoint;
h:HWND;
s:array [0..255] of char;
DC: HDC;
clr: COLORREF;
begin

GetCursorPos(p);

//Get Class Name
h:=WindowFromPoint(p);
GetClassName(h,s,255);
labHandle.Caption:=format('0x%x',[h]);
labclassname.Caption:=s;
h:=GetParent(h);
GetClassName(h,s,255);
labParent.Caption:=s;

//Get Color
DC := GetDC(HWND(nil));
clr := GetPixel(DC, p.x, p.y);
labColor.Caption := format('R:%d G:%d B:%d',[GetRValue(clr),GetGValue(clr),GetBValue(clr)]);
labDelphiColor.Caption := format('%d ($%x)',[clr,clr]);
//labHtmlColor.Caption := '#'+ColorToHTMLHex(clr);
//Shape1.Brush.Color := clr;

end;

这段代码不但能实现得到任意窗口句柄、类名还能实现屏幕取色
 
同意zw84611的做法。
 
to zw84611:
你真行﹐看來我又要另開帖子給分了。
 
好,我试试。谢谢各位捧场。
 
to zw84611:
你写的代码确实能获得程序的 ClassName等,不过我想有没有更好的办法直接通过
EXE文件名就能得到某个应用程序的句柄,这样才叫绝呀。
 
本程序基本功能已实现,目前想优化一下。想法如下:
怎样才能得到操作系统启动一个应用程序的消息,然后再对这个应用程序作监视?
 
简单的方法是用一个Timer,不断FindWindow()
 
to zw84611:
我不想那么做,我这种想法的出发点就是模仿Win中断系统。要按你那样做的话会
很费时的,并且系统也很难再做其他事情。
 
没那么严重。其实以现在机器的性能,一点问题都不会有。
 
to zw84611:
我试过的,那样做的话系统反应确实慢!这与计算机的速度无关,是与计时器相关的。
 
参考一下:0499201,不知道行不行。
 
简单啊,需要两个钩子:
1 监视启动的窗体是否是你需要的窗体。钩子1
2 用键盘钩子获取指定窗体的键盘消息。钩子2
 
后退
顶部