截获其他窗口消息一定要hook吗(50)

  • 主题发起人 主题发起人 大器晚成
  • 开始时间 开始时间

大器晚成

Unregistered / Unconfirmed
GUEST, unregistred user!
我看了onmessage,winproc都是接收自身消息的,如果要接收其他应用程序的窗口消息(不是sendmessage发过来的,是窗口自身触发的),不用hook行不?
 
转贴:Windows的子类化处理。 大家都知道,在windows里不管你做了什么事,都会向windows发送一条消息,然后由 Windows作出相应的处理后才会返回给传送消息的应用程序。 那大家会问:“HOOK不是已经拦截了windows消息了吗?” 是啊,那也要看是拦截了什么消息,就如上面我们写的WH_KEYBOARD,我们拦截了键盘消息,我们可以在按下任何一个按键的时候做出处理。消息的种类有很多。 可是我们今天要讲的是windows的子类化处理,这又是一门新的技术。 不废话了,这就开始。^_^ 相信大家都见过两这个API:GetWindowsLong 和 SetWindowLong; 可能你们会说,这些不是处理窗口消息的吗?对,这就是我们要用到的API。 接下来让我们看一下这些API的参数。 LONG GetWindowLong( HWND hWnd, //窗体的句柄 int nIndex //欲取回的信息,可参照下表 ); nIndex的值可以是下列任何一个 GWL_EXSTYLE 扩展窗口样式 GWL_STYLE 窗口样式 GWL_WNDPROC 该窗口的窗口函数的地址 GWL_HINSTANCE 拥有窗口的实例的句柄 GWL_HWNDPARENT 该窗口之父的句柄。不要用SetWindowWord来改变这个值 GWL_ID 对话框中一个子窗口的标识符 GWL_USERDATA 含义由应用程序规定 DWL_DLGPROC 这个窗口的对话框函数地址 DWL_MSGRESULT 在对话框函数中处理的一条消息返回的值 DWL_USER 含义由应用程序规定 也许大家会注意到 GWL_WNDPROC 这个参数。没错,我们子类处理就是要用到这个参数。 代码如下: OldProc:=GetWindowLong(hWnd,GWL_WNDPROC); 这样我们的OldProc就指向窗体的窗口函数地址; 既然得到了窗口函数地址,那么就修改到我们自定义的消息处理地址里吧。 下面要用到SetWindowLong函数了。 LONG SetWindowLong( HWND hWnd, //指定窗口句柄 int nIndex, //和GetWindowLong的nIndex一样 LONG dwNewLong //新的消息处理地址 ); 代码如下: SetWindowLong(hWnd,GWL_WNDPROC,Longint(@WinProc)); 这样就把指定窗体的消息转到了我们的函数内执行; 回调函数如下: Function WinProc(Hwnd,Msg,wParam,lParam:longint):LRESULT; stdcall; begin Result:=CallWindowProc(OldProc,Hwnd,Msg,wParam,lParam); end; 这里的Msg就是窗口的消息,后面赋上消息表。
 
问问大家,这算回答了吗
 
不用Hook也行 你在目标进程内申请一块内存 写入你的代码指令 然后SetWindowLong把目标窗口的WndProc替换成你写入的指令就行了
 
任一窗口的一个事件如最大化事件
 
窗体最大化:procedure TForm1.Button1Click(Sender: TObject);begin SetWindowLong(Handle, GWL_STYLE, GetWindowLong(Handle, GWL_STYLE) and not WS_CAPTION); self.WindowState := wsMaximized;end;
 
1.哪一类的消息?还是所有消息?2.其他进程的窗口最好用HOOK,子类化一次替换一个窗口,多个窗口需要多次
 
de410没看清我的问题,是别的窗口最大化(如IE,notepad),当前程序收到消息做相应处理。if otherEXE.maxMized then application.doSomething 。。。。。。。
 
农民法,用线程监视别的窗口,最大化了,就执行相应事件....
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部