delphi代码实现窗口最小化,最大化,*动静发送

时间:2022-01-18 08:22:21

代码实现窗口最小化,最大化,*

var hwnd: hwnd;//句柄

PostMessage(hwnd,WM_SYSCOMMAND, SC_MINIMIZE,0); //最小化
PostMessage(hwnd,WM_SYSCOMMAND, SC_MAXIMIZE,0);//最大化
PostMessage(hwnd,WM_SYSCOMMAND, SC_CLOSE,0);//*

窗口最小化时将释放占用的资源

PostMessage(hwnd,WM_SYSCOMMAND, SC_MINIMIZE,0)比showwindow(hwnd,SW_MINIMIZE)好用

在控制另外应用措施的时候,,经常需要期待直到某个成果结束,例如:
打开一个窗口-->期待直到窗口结束
这个时候就可以用到SendMessage
如果在打开这个窗口后仍然需要对该窗口的界面进行设置,好比Edit的value等等,好比:
打开一个窗口-->控制窗口的control的属性
这个时候就需要PostMessage

使用一个钩子措施截获动静后,使用SendMessage把动静发送到主措置惩罚惩罚措施进行措置惩罚惩罚,但是在主措置惩罚惩罚措施还没有完成任务的时候,被设置钩子的措施进入了遏制的状态,不成以措置惩罚惩罚
WM_PAINT,
WM_MOVE,
.......等的根基信息,
必需要等SendMessage发送出的动静完成后,才华继续运行,整个界面一片空白,把钩子动静设置成PostMessage的发送动静形式后,问题解决!
我查了MSDN对这两个API的界说,
PostMessage只是把动静放入行列队伍,不管其他措施是否措置惩罚惩罚都返回,然后继续执行;
而SendMessage必需期待其他措施措置惩罚惩罚动静后才返回,继续执行。
PostMessage的返回值暗示PostMessage函数执行是否正确;
而SendMessage的返回值暗示其他措施措置惩罚惩罚动静后的返回值。 
使用这两个发送动静函数的最重要的是要看你的措施是否要对动静的滞后性存眷否,PostMessage会造成动静的滞后性,而SendMessage则不会,但如果SendMessage动静措置惩罚惩罚掉败,则会造成措施遏制!

1, PostMessage只把动静放入行列队伍,不管其他措施是否措置惩罚惩罚都返回,然后继续执行,这是个异步动静投放函数。而SendMessage必需期待其他程 序措置惩罚惩罚动静完了之后才返回,继续执行,这是个同步动静投放函数。而且,PostMessage的返回值暗示PostMessage函数执行是否正确;而 SendMessage的返回值暗示其他措施措置惩罚惩罚动静后的返回值。这点大家应该都大白。

2, 如果在同一个线程内,PostMessage发送动静时,动静要先放入线程的动静行列队伍,然后通过动静循环Dispatch到方针窗口。 SendMessage发送动静时,系统直接挪用方针窗口的动静措置惩罚惩罚措施,并将功效返回。SendMessage在同一线程中发送动静并不入线程动静队 列。 如果在差别线程内。最好用PostThreadMessage取代PostMessage,他事情的很好。SendMessage发送动静到方针窗口所属 的线程的动静行列队伍,然后发送动静的线程期待(事实上,他应该还在做一些监测事情,好比监视QS_SENDMESSAGE标识表记标帜),直到方针窗口措置惩罚惩罚完并且结 果返回,发送动静的线程才继续运行。这是SendMessage的一般情况,事实上,措置惩罚惩罚过程要庞大的多。好比,当发送动静的线程监测到有另外窗口 SendMessage一个动静到来时,他直接挪用窗口措置惩罚惩罚过程(重入),并将措置惩罚惩罚功效返回(这个过程不需要动静循环中GetMessage等的撑持)。

3, msdn: If you send a message in the range below WM_USER to the asynchronous message functions (PostMessage, SendNotifyMessage, and SendMessageCallback), its message parameters can not include pointers. Otherwise, the operation will fail.

如果发送的动静码在WM_USER之下(非自界说动静)且动静参数中带有指针,那么 PostMessage,SendNotifyMessage,SendMessageCallback这些异步动静发送函数将会挪用掉败。 最好不要用PostMessage发送带有指针参数的动静。