`
deepfuture
  • 浏览: 4397526 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:80021
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:69976
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:103284
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:285593
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:15001
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:67489
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:32095
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:45963
社区版块
存档分类
最新评论

WIN32汇编语言学习应用之消息获取

阅读更多

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;

}

}

}
分享到:
评论

相关推荐

    win32汇编语言集成开发环境

    8. **实践应用**:Win32汇编语言在驱动开发、系统优化、游戏编程等领域有广泛应用。通过IDE,开发者能够创建高效的系统级程序,解决那些高级语言无法胜任的复杂任务。 总之,Win32汇编语言集成开发环境为汇编程序员...

    [源码]WIN32汇编语言实现的经典俄罗斯方块游戏

    WIN32汇编语言虽然学习曲线较陡峭,但能提供对系统底层的直接控制,为开发者带来无尽的创新可能。通过研究这个项目,不仅能够提升汇编语言的技能,还能进一步理解游戏开发的基础原理,为更高级的编程技术打下坚实...

    Win32 汇编计算器

    本篇将深入探讨如何使用汇编语言编写一个Win32计算器,该计算器虽然不处理运算优先级,但能实现基本的计算功能,并允许用户输入包含多个运算符的表达式。 首先,我们要理解Win32 API(应用程序接口),它是Windows...

    Win32汇编源码

    Win32汇编源码是计算机编程领域中的一个重要分支,主要关注的是在Windows操作系统环境下,用汇编语言编写程序的方法。汇编语言是一种低级语言,它的指令与计算机硬件的机器语言非常接近,使得程序员可以直接控制...

    从Dos到Win32汇编从Dos到Win32汇编[评价可免费]

    《从Dos到Win32汇编》是一本深入探讨计算机底层技术的书籍,主要涵盖了从传统的DOS操作系统到现代的Windows 32位系统下的汇编语言编程知识。这本书的目标是帮助读者理解从简单的DOS环境到复杂Windows环境下的程序...

    Win32汇编实现可接受拖放文件的窗口

    在Windows编程中,Win32汇编语言是一种强大的工具,可以用来创建低级别的系统级应用程序。本项目"Win32汇编实现可接受拖放文件的窗口"专注于利用Win32 API来创建一个窗口,该窗口能够接收用户通过拖放操作传递的多个...

    win32 汇编写的虚拟钢琴 多种音色 仿真实时按键 支持多键 汇编程序设计

    《win32汇编语言构建的虚拟钢琴:深入解析与技术探索》 在计算机编程的世界里,汇编语言一直占据着特殊的地位。它是最接近硬件的语言,能够直接操控计算机的每一个细微动作,因此在实现某些特定功能时,尤其是对...

    Win32汇编实现俄罗斯方块

    本篇文章将深入探讨如何利用Win32汇编语言实现经典游戏——俄罗斯方块。 首先,我们来理解Win32汇编语言。它是微软为Windows操作系统提供的API(应用程序接口)的汇编版本,允许开发者直接操纵系统的窗口、消息、...

    用WIN32汇编写的俄罗斯方块

    《用WIN32汇编语言实现的俄罗斯方块》 在计算机编程的世界中,WIN32汇编语言是一种低级编程语言,它直接与计算机硬件交互,提供了对系统资源的直接控制。本项目以WIN32汇编为工具,实现了经典游戏——俄罗斯方块。...

    琢石成器—Windows环境下32位汇编语言程序设计

    同时,罗云彬从1990年开始使用汇编语言编程,并且是国内早期研究Windows 32位汇编语言的程序员之一,他创办的网站***,为汇编语言编程爱好者提供了一个探讨和学习的平台。 在描述中还指出,本书《Windows环境下32位...

    Windows环境下32位汇编语言程序设计 罗云彬

    1. **Win32 API与汇编语言结合**:本书的一个显著特点是将Win32 API与汇编语言相结合,使得开发者能够在更底层的层次上理解Windows系统的工作机制。通过直接调用Win32 API函数,开发者可以实现更加高效和精确的控制...

    罗云彬Win32位汇编书中的源码

    《罗云彬Win32位汇编书中的源码》是针对罗云彬关于Win32汇编语言著作的配套代码资源,对于学习Win32汇编编程的读者来说是一份宝贵的参考资料。这本书深入浅出地讲解了如何使用汇编语言在Windows 32位平台上进行程序...

    win32汇编仿千千静听主界面

    1. **Win32汇编语言**: Win32汇编是微软为Windows操作系统设计的一种汇编语言,它直接对应于Windows API调用。通过汇编语言,开发者可以直接控制CPU的操作,实现对系统资源的高效利用。然而,由于其语法复杂,学习...

    win32汇编errshow附原码

    总结来说,"errshow"是一个实用的win32汇编错误代码查询工具,它的存在简化了开发者的调试过程,同时也是一个学习win32汇编语言和错误处理机制的良好案例。通过分析其源代码,我们可以深入了解系统错误处理的底层...

    罗云彬WIN32环境汇编光盘

    此光盘的内容涵盖了从基础概念到高级应用的全面教程,旨在帮助学习者深入理解WIN32环境下汇编语言的工作原理。 在WIN32环境下,汇编语言通常与Microsoft的MASM(Microsoft Macro Assembler)或者其他兼容的汇编器如...

    罗云斌琢石成器win32汇编源代码

    总的来说,《罗云斌琢石成器win32汇编源代码》是学习Win32汇编语言的重要资源,它提供了一手的实践经验,有助于读者深化对计算机底层运作的理解,提升编程技能。通过逐个章节研究和实践,读者可以逐步成长为熟练的...

    用WIN32汇编写的鼠标钩子实例

    标题“用WIN32汇编写的鼠标钩子实例”揭示了这个项目是关于在Windows操作系统环境下,使用汇编语言实现的一个低级鼠标钩子(WH_MOUSE_LL)的应用示例。让我们深入探讨一下这个主题。 首先,我们要理解的是**Win32...

    win7上学习汇编

    为了帮助用户更好地学习汇编语言,我们推荐阅读王爽的汇编语言编程书籍,并且可以查看相关的在线资源和视频教程,以获取更多的学习帮助和支持。 Win7上学习汇编需要用户具备基本的计算机知识和编程基础,同时需要...

Global site tag (gtag.js) - Google Analytics