加上输出
function MyProc(nCode:integer;Wparam:integer;Lparam:integer):longint;export;
function MyProc(nCode:integer;Wparam:integer;Lparam:integer):longint;export;
解决方案 »
- 有没有人用过 CBX 开发BS架构的程序?
- 关闭外部程序问题
- delphi程序员薪水大揭秘!!!!!!!
- 继承的窗体显示时为什么闪烁?
- 问两个和游戏相关的问题
- 如何实现将记录集从Oracle数据库中写到XML中?最好能提供源码。
- 我是用ORACLE数据库,使用oraquery查询显示数据,因为数据量比较大,有等待时间,我想查询中中断查询,因该怎么搞,唉????
- 求救关于SOCKET编程方面的问题
- B/S结构的DELPHI程序出错(采用OCX形式发布对象放到网页上的形式)!
- 从一个数组构造位图,然后显示在TCanvas上,该怎么做?
- 有关ADO连接Oracle数据库时的BLOB的问题
- 如何在程序中开启FTP服务?
cxx1997(小网虫_L)重载怎么做呀?说明白一点,谢谢!
procedure WMNCPaint(var Msg : TWMNCPaint); message WM_Paint;
这样就行了,
如果你想用鼠标钩子,
那请看看这个
http://www.csdn.net/expert/topic/863/863265.xml?temp=.2376673
我帖的第一帖
SPY跟踪Notepad的WM_CLOSE Message,发现该参数是这样的,WM_CLOSE,0,0
这就说明,nCode=WM_CLOSE,Wparam=0,Lparam=0(我想应该是这样的),但是,我的nCode就是不能获取该数值,你说怎么办?
但你的myproc必须放在dll中,而你的写myproc的时候没有写export
用下面的试试
function MyProc(nCode:integer;Wparam:integer;Lparam:integer):longint;export;
其它的好象没有问题。
拦截系统或者其他进程的消息一定要用全局钩子,此时需要把回调函数写在DLL里,我是用VC写不基于MFC的DLL,用DELPHI调用碰到很多问题,如果用DELPHI写DLL一般可能不会有什么大问题,你可以试试。我这个月都在研究钩子,写一个可以把别人的程序套到我的框架并增加某些功能的程序。
(大家不要说我无耻,实在是外国编的程序太牛了,自己没这实力,只好给他装一个我的封面。绝对不会用在中国人开发的程序上。)
有什么问题可以跟我讨论。我的qq是12033948,不太爱在线,你可以留话,我可以给你一些代码。哎,我提的问题
http://www.csdn.net/Expert/TopicView1.asp?id=878757
http://www.csdn.net/Expert/TopicView1.asp?id=876553
http://www.csdn.net/Expert/TopicView1.asp?id=869955
http://www.csdn.net/Expert/TopicView1.asp?id=874911
都没人理,第一个我自己解决了,剩下的回避了
看来用DELPHI的人只对数据库感兴趣,对WINDOWS编程都不熟
HookID=SetWindowsHookEx(WH_GETMESSAGE,@MyProc,HINSTANCE,0);
而function MyProc(nCode:integer;Wparam:integer;Lparam:integer):longint;stdcall;
该函数没有引出,难道一定要加export吗?
如果没有引出,其它的线程怎么会访问???
然后在单元内部写function MyProc(nCode:integer;Wparam:integer;Lparam:integer):longint;stdcall;
begin
beep;
if nCode=WM_CLOSE then
showmessage('ok');
Result:=CallNextHookEx(HookID,nCode,Wparam,Lparam);
end;
事实,当拦截键盘的时候,成功,而拦截系统消息的时候,其实消息也经过这里了,因为我在里面加了Beep,结果证明消息经过这里,但是就是不能得到消息的结果,列如WM_CLOSE!
得有时间了,测试一下在说吧,呵呵!!!
或者你换个消息试试,比如说wm-paint或这wm-size,看是都拦截不到还是只有close不行。
也可以发送自己定义的消息。
先得到问题的全部状况再想办法。
nCode永远为0,Wparam和Lparam时常会变,我想,nCode一定是消息,但是怎么得到呢?
呼叫getmessage或peekmessage的那个线程就是执行wh-getmessage filter function的执行线程。
其中参数和返回值:
nCode wParam lParam lResult
HC_ACTION NULL 指向一个msg结构 未使用,返回0看到了吗,lparam才是消息 !!!
呼叫getmessage或peekmessage的那个线程就是执行wh-getmessage filter function的执行线程。
其中参数和返回值:
nCode wParam lParam lResult
HC_ACTION NULL 指向一个msg结构 未使用,返回0看到了吗,lparam才是消息 !!!
用SPY测试,当我直接关闭记事本的时候,消息是这样的:
nCode wParam lParam lResult
WM_CLOSE 00000000 00000000 00000000但是当我向记事本用程序发送WM_CLOSE消息的时候,消息是这样的:
nCode wParam lParam lResult
WM_CLOSE 00000000 0012F450 00000000我看帮助,lParam是Msg结构
但是我的函数是这样写的
function MyProc(nCode:integer;Wparam:integer;Lparam:integer);integer;stdcall
不知道是不是正确,不过,我想应该是对的,如果不对,是不是可以这样写?
function MyProc(nCode:integer;Wparam:integer;Lparam:msg);integer;stdcall
if PMessage(lParam)^.Msg = wm_close then
............
if PMessage(lParam)^.Msg = wm_close then
............
然后把自己的函数改成以下形式了:
function MyProc(nCode:integer;wParam:wParam;lParam:pointer):LRESULT;stdcall;export;
var MyMsg:^Msg;
begin
MyMsg:=lParam;
if MyMsg.message =WM_CLOSE then
showmessage('ok');
Result:=0;
//Result:=CallNextHookEx(HOOKID,nCode,Wparam,Lparam);
end;
var
pcs:TMSG;
begin
pcs:=TMSG(PMSG(lParam)^);
if nCode>=0 then
begin
if pcs.message=wm_lbuttonup then
...........
end;
Result:=CallNextHookEx(0,nCode,wParam,lParam);
end;
//比对一下这个看看,或者到
http://ewaysoft.myrice.com/Dtext/delphi703.htm自己看看;
我重新测试一下,发现,代码一点问题都没有,消息能拦截WM_LBUTTONDBLCLK,WM_MOUSEMOVE,WM_KEYDOWN等消息,但是如果是WM_CLOSE,就不能收到,我用的系统是XP/Delphi,没有问题吧?不过我敢肯定,一定是没有找到真正解决的方案!现在我最需要的就是拦截WM_CLOSE!
GETMESSAGE只能监视用POSTMESSAGE发给窗口的消息,
主要是键盘鼠标和一些排队的消息,
而WM_CLOSE是用SENDMESSAGE发给窗体的,所以你用错了钩子。
楼上的兄弟说的对,用CALLWNDPROC或CALLWNDPROCRET都可以拦到WM_CLOSE。
但是同样的,用这两个钩子只能拦SENDMESSAGE发的消息,所以别想用他们拦键盘鼠标消息。
所以你会发现VC的SPY++挂了3个钩子,就分别是以上