MSG结构:
MSG STURCT
Hwnd DWORD ?
Message DWORD ?
WParam DWORD ?
LParam DWORD ?
Time DWORD ?
Pt POINT <>
MSG ENDS
:em21:
hwnd:消息要发向的窗口句柄
Message:消息标识符
Wparam:消息的参数之一
Lparam:消息的参数之二
Time:消息放入消息队列的时间。
pt:消息放入消息队列时的鼠标坐标,一个point结构。
getmessage函数
msdn解释
The GetMessage function retrieves a message from the callingthread's message queue. The function dispatches incoming sentmessages until a posted message is available for retrieval.
Unlike GetMessage, the PeekMessage function does not wait for amessage to be posted before returning.
语法
BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
);
getmessage的一个使用误区(来自msdn,算是权威了)
Because the return value can be nonzero, zero, or -1, avoid codelike this:
while (GetMessage( lpMsg, hWnd, 0, 0)) ...
虽然如果取得了WM_QUIT消息返回0,但是如果API执行发生了错误,则返回-1
The possibility of a -1 return value means that such code can leadto fatal application errors. Instead, use code like this:
下面的代码就处理了这样的问题
BOOL bRet;
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) !=0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
1、msdn的基本解释:
PeekMessage Function peekmessage函数
--------------------------------------------------------------------------------
The PeekMessage function dispatches incoming sent messages, checksthe thread message queue for a posted message, and retrieves themessage (if any exist).
Syntax
BOOL PeekMessage( LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax,
UINT wRemoveMsg
);
2、与getmessage的主要相同
PeekMessage is similar to the GetMessage function; both check amessage queue for a message that matches the filter criteria andthen copy the message to an MSG structure.
它们都可以在经过筛选标准的消息队列中,取得消息并COPY到MSG结构中。它们都可以通过参数指定得到特定的消息。
3、与getmessage的主要不同
(1)多了一个参数wRemoveMsg,定义消息如何被处理。
wRemoveMsg
Specifies how messages are handled. This parameter can be one ofthe following values.
PM_NOREMOVE
Messages are not removed from the queue after processing byPeekMessage.
在peeakmessage执行完后,不从消息队列中删除该消息
PM_REMOVE
Messages are removed from the queue after processing byPeekMessage.
在peeakmessage执行完后,从消息队列中删除该消息
You can optionally combine the value PM_NOYIELD with eitherPM_NOREMOVE or PM_REMOVE. This flag prevents the system fromreleasing any thread that is waiting for the caller to go idle (seeWaitForInputIdle).
By default, all message types are processed. To specify that onlycertain message should be processed, specify one or more of thefollowing values.
默认为处理所有类型的消息,如果只处理特定类型的消息,如下:
PM_QS_INPUT
Windows 98/Me, Windows 2000/XP: Process mouse and keyboardmessages.
PM_QS_PAINT
Windows 98/Me, Windows 2000/XP: Process paint messages.
PM_QS_POSTMESSAGE
Windows 98/Me, Windows 2000/XP: Process all posted messages,including timers and hotkeys.
PM_QS_SENDMESSAGE
Windows 98/Me, Windows 2000/XP: Process all sent messages.
(2)peekmessage如果有符合要求的消息可得到,则返回非0,如果得不到符合要求的消息则返回0;而getmessage如果在消息队列中得不到符合要求的有效消息就不会返回。
The main difference between the two functions is that GetMessagedoes not return until a message matching the filter criteria isplaced in the queue, whereas PeekMessage returns immediatelyregardless of whether a message is in the queue.
以MSDN中的例子来说,
Occasionally, an application needs to examine the contents of athread's message queue from outside the thread's message loop. Forexample, if an application's window procedure performs a lengthydrawing operation, you may want the user to be able to interruptthe operation. Unless your application periodically examines themessage queue during the operation for mouse and keyboard messages,it will not respond to user input until after the operation hascompleted. The reason for this is that the DispatchMessage functionin the thread's message loop does not return until the windowprocedure finishes processing a message.
上面的大致是说,如果你想在你定义的线程消息循环之外取得线程消息(线程消息队列是WINDOWS自动为每个线程维护的消息队列)。如一个窗口过程执行一个需要时间很长的操作,而你又想让用户能终止这一操作,比如按某一个键等等,但存在一个问题,DispatchMessage语句将一个消息分派给WINDOWS处理,WINDOWS又把这个消息转交给相应的窗口过程处理,在窗口过程处理完前,dispatchmessage是不会返回的,而这个很长的操作又正好是窗口过程执行的,
使用peekmessage来做这项检查工作最好,由它来定期检查消息队列中有无用户终止操作的相关消息,为什么不用getmessage呢,如果用户在窗口过程执行的过程中无终止的消息,或者因为用户无动作消息队列中根本无消息,那
getmessage岂不只能等着WINDOWS送消息进队列里来,否则它就不返回了,程序挂起了,无法起到检查消息队列的作用,而peekmessage则不同,取不到有效消息也返回。
下面是msdn的c++代码,只要用户按一个键或鼠标,则终止操作
The following example shows how to use PeekMessage to examine amessage queue for mouse clicks and keyboard input during a lengthyoperation.
HWND hwnd;
BOOL fDone;
MSG msg;
// Begin the operation and continue until it is complete
// or until the user clicks the mouse or presses a key.
fDone = FALSE;
while (!fDone)
{
fDone = DoLengthyOperation(); // application-defined function
// Remove any messages that may be in the queue. If the
// queue contains any mouse or keyboard
// messages, end the operation.
while (PeekMessage(&msg, hwnd, 0, 0,PM_REMOVE))
{
switch(msg.message)
{
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_KEYDOWN:
//
// Perform any required cleanup.
//
fDone = TRUE;
}
}
}
分享到:
相关推荐
8. **实践应用**:Win32汇编语言在驱动开发、系统优化、游戏编程等领域有广泛应用。通过IDE,开发者能够创建高效的系统级程序,解决那些高级语言无法胜任的复杂任务。 总之,Win32汇编语言集成开发环境为汇编程序员...
WIN32汇编语言虽然学习曲线较陡峭,但能提供对系统底层的直接控制,为开发者带来无尽的创新可能。通过研究这个项目,不仅能够提升汇编语言的技能,还能进一步理解游戏开发的基础原理,为更高级的编程技术打下坚实...
本篇将深入探讨如何使用汇编语言编写一个Win32计算器,该计算器虽然不处理运算优先级,但能实现基本的计算功能,并允许用户输入包含多个运算符的表达式。 首先,我们要理解Win32 API(应用程序接口),它是Windows...
Win32汇编源码是计算机编程领域中的一个重要分支,主要关注的是在Windows操作系统环境下,用汇编语言编写程序的方法。汇编语言是一种低级语言,它的指令与计算机硬件的机器语言非常接近,使得程序员可以直接控制...
《从Dos到Win32汇编》是一本深入探讨计算机底层技术的书籍,主要涵盖了从传统的DOS操作系统到现代的Windows 32位系统下的汇编语言编程知识。这本书的目标是帮助读者理解从简单的DOS环境到复杂Windows环境下的程序...
在Windows编程中,Win32汇编语言是一种强大的工具,可以用来创建低级别的系统级应用程序。本项目"Win32汇编实现可接受拖放文件的窗口"专注于利用Win32 API来创建一个窗口,该窗口能够接收用户通过拖放操作传递的多个...
《win32汇编语言构建的虚拟钢琴:深入解析与技术探索》 在计算机编程的世界里,汇编语言一直占据着特殊的地位。它是最接近硬件的语言,能够直接操控计算机的每一个细微动作,因此在实现某些特定功能时,尤其是对...
本篇文章将深入探讨如何利用Win32汇编语言实现经典游戏——俄罗斯方块。 首先,我们来理解Win32汇编语言。它是微软为Windows操作系统提供的API(应用程序接口)的汇编版本,允许开发者直接操纵系统的窗口、消息、...
《用WIN32汇编语言实现的俄罗斯方块》 在计算机编程的世界中,WIN32汇编语言是一种低级编程语言,它直接与计算机硬件交互,提供了对系统资源的直接控制。本项目以WIN32汇编为工具,实现了经典游戏——俄罗斯方块。...
同时,罗云彬从1990年开始使用汇编语言编程,并且是国内早期研究Windows 32位汇编语言的程序员之一,他创办的网站***,为汇编语言编程爱好者提供了一个探讨和学习的平台。 在描述中还指出,本书《Windows环境下32位...
1. **Win32 API与汇编语言结合**:本书的一个显著特点是将Win32 API与汇编语言相结合,使得开发者能够在更底层的层次上理解Windows系统的工作机制。通过直接调用Win32 API函数,开发者可以实现更加高效和精确的控制...
《罗云彬Win32位汇编书中的源码》是针对罗云彬关于Win32汇编语言著作的配套代码资源,对于学习Win32汇编编程的读者来说是一份宝贵的参考资料。这本书深入浅出地讲解了如何使用汇编语言在Windows 32位平台上进行程序...
1. **Win32汇编语言**: Win32汇编是微软为Windows操作系统设计的一种汇编语言,它直接对应于Windows API调用。通过汇编语言,开发者可以直接控制CPU的操作,实现对系统资源的高效利用。然而,由于其语法复杂,学习...
总结来说,"errshow"是一个实用的win32汇编错误代码查询工具,它的存在简化了开发者的调试过程,同时也是一个学习win32汇编语言和错误处理机制的良好案例。通过分析其源代码,我们可以深入了解系统错误处理的底层...
此光盘的内容涵盖了从基础概念到高级应用的全面教程,旨在帮助学习者深入理解WIN32环境下汇编语言的工作原理。 在WIN32环境下,汇编语言通常与Microsoft的MASM(Microsoft Macro Assembler)或者其他兼容的汇编器如...
总的来说,《罗云斌琢石成器win32汇编源代码》是学习Win32汇编语言的重要资源,它提供了一手的实践经验,有助于读者深化对计算机底层运作的理解,提升编程技能。通过逐个章节研究和实践,读者可以逐步成长为熟练的...
标题“用WIN32汇编写的鼠标钩子实例”揭示了这个项目是关于在Windows操作系统环境下,使用汇编语言实现的一个低级鼠标钩子(WH_MOUSE_LL)的应用示例。让我们深入探讨一下这个主题。 首先,我们要理解的是**Win32...
为了帮助用户更好地学习汇编语言,我们推荐阅读王爽的汇编语言编程书籍,并且可以查看相关的在线资源和视频教程,以获取更多的学习帮助和支持。 Win7上学习汇编需要用户具备基本的计算机知识和编程基础,同时需要...