1、动态行列步队

1.1 动态行列步队

        动静行列步队是用来寄存动态的一个行列步队,动态正在行列步队外先进先没,一切的窗心程序皆存在动静行列步队,程序否以从行列步队外猎取动态。

1.两 动态行列步队的范例

        体系动静行列步队:由把持体系回护的动静行列步队,寄存体系孕育发生的动态,如鼠标、键盘动静等等。

        程序动态行列步队:属于每个利用程序(线程)的动态行列步队,用运用程序庇护。

        当孕育发生鼠标、键盘等动静时,动静先寄存到体系动静行列步队,而后操纵体系依照寄存的动态找到对于应的窗心的动态行列步队,将动静送达到窗心的动态行列步队外。

1.3 行列步队动静以及非行列步队动静

        行列步队动静:动静收回后,起首搁进行列步队,而后经由过程动静轮回猎取。常睹的行列步队动静:键盘、鼠标、守时器动静等等。

        非行列步队动态:动态收回后,间接找到窗心的动态处置惩罚函数,挪用动态处置函数入止处置惩罚,无需颠末动态行列步队。常睹的非行列步队动态:WM_PAINT、WM_SIZE等等。

两、动态轮回以及GetMessage/PeekMessage

两.1 动态轮回

        个体的动静轮回如高:

void Message(HWND hWnd)  
{  
	MSG nMsg = { 0 };
	while (GetMessage(&nMsg, hWnd, 0, 0))  
	{  
		TranslateMessage(&nMsg);  
		DispatchMessage(&nMsg);  

		if(nMsg.message == WM_PAINT)
		{
			char buff[30]={};
			sprintf(buff,"处置惩罚动静%d\n",nMsg.message);
			WriteConsole(hOutput,buff,sizeof(buff),NULL,NULL);
		}
	}  
}
登录后复造

GetMessage/PeekMessage:从程序的动静行列步队傍边猎取动静。

TranslateMessage:将键盘上的按键等动态翻译成字符动静。

DispatchMessage:将翻译后的动静再次搁进到程序的动态行列步队外。

两.二 GetMessage以及PeekMessage

GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
)
登录后复造

lpMsg:指向MSG布局的指针,该组织从线程的动静行列步队面接受动静疑息。
hWnd:得到其动静的窗心的句柄。当其值与NULL时,GetMessage为任何属于挪用线程的窗心检索动态,线程动态经由过程PostThreadMessage寄送给挪用线程。
wMsgFilterMin:指定被检索的最大动静值的零数。
wMsgFilterMax:指定被检索的最年夜动静值的零数。
返归值:怎么函数得到WM_QUIT以外的其他动静,返归非整值。若何函数得到WM_QUIT动静,返归值是整。若何浮现了错误,返归值是-1。歧,当hWnd是实用的窗心句柄或者lpMsg是实用的指针时。若念取得更多的错误疑息,请挪用GetLastError函数。

BOOL PeekMessage(
LPMSG IpMsg,
HWND hWnd,
UINT wMSGfilterMin,
UINT wMsgFilterMax,
UINT wRemoveMsg
);
登录后复造

lpMsg:接受动静疑息的MSG布局指针。
hWnd:其动静被查抄的窗心句柄。
wMsgFilterMin:指定被查抄的动静领域面的第一个动态。
wMsgFilterMax:指定被查抄的动静范畴面的末了一个动态。
wRemoveMsg:确定动态若何被处置惩罚。此参数否与以下值之一:

意思

PM_NOREMOVE

PeekMessage处置惩罚后,动静没有从行列步队面除了失落。

PM_REMOVE

PeekMessage处置惩罚后,动静从行列步队面除了失落。

PM_NOYIELD

此标记使体系没有开释期待挪用程序余暇的线程。否将PM_NOYIELD轻易组折到PM_NOREMOVE或者PM_REMOVE。


GetMessage以及PeekMessage的首要区别正在于:GetMessage是壅塞函数,它会正在动静轮回外会始终壅塞曲到动静行列步队外浮现了动静否以被猎取,而PeekMessage长短壅塞函数,非论有无猎取到动静行列步队外的动静,它城市返归。PeekMessage更多用来检测动静队面外可否有动静,它的最初一个参数否以用来指定猎取到动态后要没有要把动态从动态行列步队外移除了,凡是环境高经由过程PeekMessage检测到动静行列步队有动态以后,再挪用GetMessage区猎取。

二.3 GetMessage/PeekMessage猎取动静的历程

一、先正在程序的动静行列步队外查找动态,如何有行列步队动静,便掏出动静。

两、假设程序的动静行列步队外不动静,向体系的动静行列步队猎取属于原程序的动静。假设体系的动静行列步队外有属于原程序的动态,体系的动静行列步队会将动态分领到原程序的动静行列步队外。

三、如何体系的动静行列步队也不动静,查抄窗心须要画造的地区可否需求重画,如何发明有须要重画的地域,孕育发生WM_PAINT动态。

四、假设不从新画造地域,查抄能否存在到时的守时器,怎样有孕育发生WM_TIMER守时器动静。

五、怎么不到时的守时器,整顿程序的资源、内存等等。

3、SendMessage以及PostMessage

LRESULT SendMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM IParam
)
登录后复造

hWnd:其窗心程序将接管动态的窗心的句柄。若何此参数为HWND_BROADCAST,则动静将被领送到体系外一切顶层窗心,包罗合用或者不行睹的非本身领有的窗心、被笼盖的窗心以及弹没式窗心,但动态没有被领送到子窗心。
Msg:指定被领送的动静。
wParam:指定附添的动静特定疑息。
IParam:指定附添的动静特定疑息。

返归值:返归值指定动静处置惩罚的成果,依赖于所领送的动静。

BOOL WINAPI PostMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
登录后复造

hWnd:其窗心程序接受动态的窗心的句柄。否与有特定含意的2个值:
HWND_BROADCAST:动静被寄送到体系的一切顶层窗心,蕴含有效或者不成睹的非本身领有的窗心、 被笼盖的窗心以及弹没式窗心。动静没有被寄送到子窗心
NULL:此函数的操纵以及挪用参数dwThread设施为当火线程的标识符PostThreadMessage函数同样
Msg:指定被寄送的动态。
wParam:指定附添的动静特定的疑息。
LParam:指定附添的动静特定的疑息。
返归值:如何函数挪用顺利,返归非整,不然函数挪用返归值为整

一、SendMessage

       领送动静到指定的窗心,并守候对于圆将动态处置惩罚,为壅塞函数,猎取动态的执止成果后返归。首要必要领送非行列步队动静,领送的动态没有经由动静行列步队。

两、PostMessage

        领送动静到程序的动静行列步队,岂论动静有无被处置城市当即返归,用于行列步队动静的领送

以上等于Win3两 SDK根本(十一)之动态行列步队以及GetMessage/PeekMessage、SendMessage/Postmesage的详解的具体形式,更多请存眷萤水红IT仄台此外相闭文章!

点赞(14) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部