| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3955 人关注过本帖
标题:GetMessage的问题
只看楼主 加入收藏
treetea
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2005-12-1
收藏
 问题点数:0 回复次数:5 
GetMessage的问题

#include <windows.h>
#include <stdio.h>

LRESULT CALLBACK WndSunProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);


int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // pointer to command line
int nCmdShow // show state of window
)

{
WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);
wndcls.hInstance=hInstance;
wndcls.lpfnWndProc=WndSunProc;
wndcls.lpszClassName="test";
wndcls.lpszMenuName=NULL;
wndcls.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndcls);



HWND hwnd;
hwnd=CreateWindow("test","第一次",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);

MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);

}

return 0;

}


LRESULT CALLBACK WndSunProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)

{
switch(uMsg)
{
case WM_CHAR:
char sz[20];
sprintf(sz,"char is %d",wParam);
MessageBox(hwnd,sz,"hello",0);

break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"hello,welcome!","hello",0);
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,40,"第一次我爱你",strlen("第一次我爱你"));
ReleaseDC(hwnd,hdc);

break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,220,410,"爱你第一次",strlen("爱你第一次"));
EndPaint(hwnd,&ps);

break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"will you exit?","exit",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);

break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);


}
return 0;
}


其中的


while(GetMessage(&msg,NULL,0,0))

该为 while(GetMessage(&msg,hwnd,0,0)

其他消息反映正常,但PostQuitMessage(0)却不能够令
程序退出。

请问这是为什么,谢谢。

搜索更多相关主题的帖子: GetMessage windows handle message instance 
2005-12-01 00:47
lisypro
Rank: 4
等 级:业余侠客
威 望:3
帖 子:695
专家分:216
注 册:2005-9-25
收藏
得分:0 

应该是你的VC的问题,我试了一下,没问题的


长期承接管理系统
代做各种vb/ / vc小程序
QQ:82341763
手机:13623290828
群号 11619730
2005-12-01 09:38
treetea
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2005-12-1
收藏
得分:0 
vc的问题?设置?
我又试了试,用while(GetMessage(&msg,hwnd,0,0)
关闭之后还能够在资源管理器中看到该程序的进程。

努力学习做程序。。。
2005-12-01 10:19
lisypro
Rank: 4
等 级:业余侠客
威 望:3
帖 子:695
专家分:216
注 册:2005-9-25
收藏
得分:0 

函数功能:该函数从调用线程的消息队列里取得一个消息并将其放于指定的结构。此函数可取得与指定窗口联系的消息和由PostThreadMesssge寄送的线程消息。此函数接收一定范围的消息值。GetMessage不接收属于其他线程或应用程序的消息。

函数原型:BOOL GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilteMax

参数:

lpMsg:指向MSG结构的指针,该结构从线程的消息队列里接收消息信息。

hWnd:取得其消息的窗口的句柄。这是一个有特殊含义的值(NULL)。GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。

wMsgFilterMin:指定被检索的最小消息值的整数。

wMsgFilterMax:指定被检索的最大消息值的整数。

返回值:如果函数取得WM_QUIT之外的其他消息,返回非零值。如果函数取得WM_QUIT消息,返回值是零。如果出现了错误,返回值是_1。例如,当hWnd是无效的窗口句柄或lpMsg是无效的指针时。若想获得更多的错误信息,请调用GetLastError函数。

备注:应用程序通常用返回值来确定是否终止主消息循环并退出程序。

GetMesssge只接收与参数hWnd标识的窗口或子窗口相联系的消息,子窗口由函数IsChild决定,消息值的范围由参数wMsgFilterMin和wMsgFilterMax给出。如果hWnd为NULL,则GetMessage接收属于调用线程的窗口的消息,线程消息由函数PostThreadMessage寄送给调用线程。GetMessage不接收属于其他线程或其他线程的窗口的消息,即使hWnd为NULL。由PostThreadMessage寄送的线程消息,其消息hWnd值为NULL。如果wMsgFilterMin和wMsgFilterMax都为零,GetMessage返回所有可得的消息(即,无范围过滤)。

常数 WM_KEYFIRST和WM_KEYAST可作为过滤值取得与键盘输入相关的所有消息:常数WM_MOUSEFIRST和WM_MOUSELST可用来接收所有的鼠标消息。如果wMsgFilterMin和wMsgFilterMax都为零,GetMessage返回所有可得的消息(即,无范围过滤)。

GetMessage不从队列里清除WM.PAINT消息。该消息将保留在队列里直到处理完毕。

注意,此函数的返回值可非零、零或-1,应避免如下代码出现:

while(GetMessage(IpMsg,hwnd,0,0))…

-1返回值的可能性表示这样的代码会导致致命的应用程序错误。


长期承接管理系统
代做各种vb/ / vc小程序
QQ:82341763
手机:13623290828
群号 11619730
2005-12-01 14:46
treetea
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2005-12-1
收藏
得分:0 

以前不能够完全看懂msdn上关于GetMessage的sdk.
这次懂了很多。
谢谢,向lisypro 致敬


努力学习做程序。。。
2005-12-01 16:43
treetea
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2005-12-1
收藏
得分:0 

引用别人的文章:


Windows窗口关闭过程 --
1、首先会产生一个WM_SYSCOMMAND消息,如果程序员没有对此消息进行拦截,则由缺省的窗口函数DefWindowProc进行处理,如果表达式(LOWORD(wParam)&0xFFF0)==SC_CLOSE 成立,DefWindowProc发出一个WM_CLOSE消息。 2、同样,如果程序员没有对WM_CLOSE消息进行拦截,则还是由DefWindowProc进行处理,这次,她只简单的调用DestroyWindow函数,DestroyWindow先把窗口破坏掉,使用户看不到窗口。但是窗口破坏后,应用程序并没有结束,于是DestroyWindow再接再励,送出了一个WM_DESTROY消息。 3、这一次,WM_DESTROY被载获了,通常是会有这样的句子: case WM_DESTROY: PostQuitMessage(0); ... 这里PostQuitMessage函数很简单的发送一个WM_QUIT消息来响应WM_DESTROY 4、WM_QUIT消息非常特殊,她使GetMessage函数返回0,从而结束了消息循环, 应用程序从此结束。


估计是因为DestroyWindow(hwnd);后,hwnd就不存在了,而GetMessage只接收hwnd的消息,所以程序消息就因为while(GetMessage(&msg,hwnd,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);

}而进入了死循环.

[此贴子已经被作者于2005-12-1 21:55:48编辑过]


努力学习做程序。。。
2005-12-01 21:55
快速回复:GetMessage的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016350 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved