怎样让用API创建的窗口不被最小化? ( 积分: 100 )

  • 主题发起人 apacheii
  • 开始时间
A

apacheii

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,一个用CreateWindowEx创建的窗口,怎样才能使它不被别的程序用SendMessage发送最小化消息来最小化?<br>我在程序里已经写了拦截SC_MINIMIZE,WM_SIZE,消息的代码,但好象根本没起到作用,用Spy工具发送最小化消息一样会被最小化。。。<br>如果是我拦截消息的方法有错误,那么怎么样才能正确的用API来拦截消息呢?
 
如题,一个用CreateWindowEx创建的窗口,怎样才能使它不被别的程序用SendMessage发送最小化消息来最小化?<br>我在程序里已经写了拦截SC_MINIMIZE,WM_SIZE,消息的代码,但好象根本没起到作用,用Spy工具发送最小化消息一样会被最小化。。。<br>如果是我拦截消息的方法有错误,那么怎么样才能正确的用API来拦截消息呢?
 
或者这样说,怎么样得知消息是从别的程序发来的,并且判断消息是不是最小化消息,并阻断它?
 
巴他子类化<br>就合QQ一样
 
QQ一样也会被最小化,不信你试试用Spy或者自己写个程序向它发送个最小化消息看看`~
 
全局HOOK最小化消息
 
把消息吃掉吧.
 
我试过全局HOOK WM_SYSCOMMAND, SC_MINIMIZE但只能是在点任务拦的时候不能最小化,按最小化按扭一样不起作用,但只是WM_SYSCOMMAND的时候又能封所有窗口的系统菜单消息,真是奇怪了。。。。。。<br>到底该吃掉什么消息呢?请各位试验一下吧!<br><br>还有,这个问题各位如果觉得分太少,我可以另开贴再加,谢谢各位。
 
直接按最小化按扭就不是'别的程序用SendMessage发送最小化消息来最小化'的了,明白?
 
恩,明白。<br>我后来想了一下,用全局HOOK的方法不太妥当,这样会影响到别的程序最小化操作。。。<br>专门Hook住一个指定的程序,只过滤掉来自它的消息就可以了,各位有没有好的方法?
 
解决思路就是这样了没错的.另外还有一个办法,就是用个Time定时查询你用CreateWindowEx创建的窗口,如果被最小化了再还原,不过这样有点笨拙效率底.
 
to mosker:<br>用这种方法的话,我的程序就一直最小化,恢复,最小化,恢复,最小化,恢复。。。。。。<br><br>专门Hook住一个指定的程序,只过滤掉来自它的消息,这应该是重点了,具体该怎么实现,怎么钩住它发送消息的功能?能用钩子钩住它的API: Postmessage吗?因为我的程序只需要不理会某一个程序的消息!至于系统要让我的程序最小化那也就随它了,呵呵。]<br><br>怎么钩住外部程序的API?
 
SendMessage(<br><br> &nbsp; &nbsp;HWND hWnd, // handle of destination window<br> &nbsp; &nbsp;UINT Msg, // message to send<br> &nbsp; &nbsp;WPARAM wParam, // first message parameter<br> &nbsp; &nbsp;LPARAM lParam // second message parameter<br> &nbsp; );<br>这个是消息原形,那么你只需要处理发向你指定那个程序的最小化就行了,也就是HWND=你指定的那个程序就处理看看有没有最消化消息如果有就拦住..
 
//设置WPARAM为SC_MINIMIZE来最小化窗口<br>SendMessage(Application-Handle,WM_SYSCOMMAND,SC_MINIMIZE,0); <br>//设置WPARAM为SC_RESTROE来恢复<br><br>我想是否是你的消息拦截错误
 
我的程序是这样的,直接用DialogBox函数从对话框资源创建了一个对话框,这样怎么在回调函数中拦截掉消息?请高人指点。
 
别的程序也好,自己也好,最后不都是window proc 处理?<br>把你的代码贴出来就知道了。
 
假设对话框模板'DLGMAIN'只是一个空的对话框模板,什么控件都没有,包含在资源文件Dlg.res中:<br>代码如下<br>program Project1;<br><br>uses<br> &nbsp;Windows, Messages;<br><br>{$R Dlg.res}<br><br>function MainProc(hDlg: hWnd; DlgMsg: UINT; wParam: WPARAM;<br> &nbsp;lParam: LPARAM):integer; stdcall;<br>var<br> &nbsp;Msg:TMsg;<br>begin<br> &nbsp;case DlgMsg of<br> &nbsp; &nbsp;WM_SYSCOMMAND:<br> &nbsp; &nbsp;case LOWORD(wParam) of<br> &nbsp; &nbsp; &nbsp;SC_CLOSE: PostQuitMessage(0);<br> &nbsp; &nbsp;end;<br> &nbsp;end;<br> &nbsp;Result := 0;<br>end;<br><br>begin<br> &nbsp;DialogBox(hInstance, 'DLGMAIN', 0, @MainProc);<br>end.<br>这段代码里怎么把最小化消息进行处理?<br>程序里即使没有处理最小化消息的代码,点最小化按扭的时候一样会被最小化!
 
begin<br> &nbsp;case DlgMsg of<br> &nbsp; &nbsp;WM_SYSCOMMAND:<br> &nbsp; &nbsp;case LOWORD(wParam) of<br> &nbsp; &nbsp; &nbsp;SC_CLOSE: PostQuitMessage(0);<br> &nbsp; &nbsp; &nbsp;SC_MINIMIZE:<br> &nbsp; &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp; ShowWindow(hwnd,SW_RESTORE);<br> &nbsp; &nbsp; &nbsp; result:=0;<br> &nbsp; &nbsp; &nbsp; exit;<br> &nbsp; &nbsp; &nbsp;end;<br> &nbsp; &nbsp;end;<br> &nbsp;end;<br> &nbsp;Result := 0;<br>end;
 
ps,还应该拦截别的消息的。
 
在问这个问题之前我就这样试过了,不起作用啊,即使Result := 0好象那消息也没有被正常拦截。。。。。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
537
import
I
I
回复
0
查看
560
import
I
顶部