首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

消息、消息.windows消息及BCB对其的处理

2012-03-05 
求助:消息、消息...windows消息及BCB对其的处理 - C++ Builder / Windows SDK/API最近,被windows消息搞的很

求助:消息、消息...windows消息及BCB对其的处理 - C++ Builder / Windows SDK/API
最近,被windows消息搞的很头疼,希望各位大哥能耐心看完,并指导指导。

1、先说说Application->OnMessage 与消息映射MESSAGE_MAP,我在同一个窗口程序中,用Application->OnMessage和消息映射,对系统屏保消息SC_SCREENSAVE进行捕获,结果,Application->OnMessage比MESSAGE_MAP更快堆消息进行了响应。这么说,Application->OnMessage是不是比MESSAGE_MAP更快一步捕获到消息?

2、由于我写的程序用到OpenCV,在某个按钮事件中,有个视频捕获循序,调用到函数cvWaitKey(),搞的我很头疼(个人认为是这样东西引起的),他搞到Application->OnMessage失效了,完全捕获不到系统消息。(VC中的preTranslateMessage也同样没用了),但我用MESSAGE_MAP对系统消息进行处理,却有了反应...我就奇怪了..OnMessage不是比MESSAGE_MAP更快么?

网上说cvWaitKey()原型如下,(没源码可跟踪)

C/C++ code
CV_IMPL intcvWaitKey( int delay ){    int time0 = GetTickCount();    for(;;)    {        CvWindow* window;        MSG message;        int is_processed = 0;        if( (delay > 0 && abs((int)(GetTickCount() - time0)) >= delay) || hg_windows == 0 )            return -1;        if( delay <= 0 )            GetMessage(&message, 0, 0, 0);        else if( PeekMessage(&message, 0, 0, 0, PM_REMOVE) == FALSE )        {            Sleep(1);            continue;        }        for( window = hg_windows; window != 0 && is_processed == 0; window = window->next )        {            if( window->hwnd == message.hwnd || window->frame == message.hwnd )            {                is_processed = 1;                switch(message.message)                {                case WM_DESTROY:                case WM_CHAR:                    DispatchMessage(&message);                    return (int)message.wParam;                case WM_KEYDOWN:                    TranslateMessage(&message);                default:                    DispatchMessage(&message);                    is_processed = 1;                    break;                }            }        }        if( !is_processed )        {            TranslateMessage(&message);            DispatchMessage(&message);        }    }}

希望大家能解释解释,为什么OnMessage失效了,而MESSAGE_MAP确行。.

3、对windows系统消息的疑惑,我对屏保消息的捕获测试中发现,如果焦点在我的窗体上,那我的程序就能拦截到屏保消息,让系统不产生屏保。但是,如果焦点不在我的窗体上,那是拦截不到的。
所以,我就产生了疑问,
(1)、系统消息不是以广播形式发给各个程序吧?
(2)、既然他不是广播,那他是先发给当前聚焦窗体,然后再系统进行响应么?他为什么要发给当前聚焦窗体让我们拦截?






[解决办法]
BCB 已經把 GetMessage()、PeekMessage() 功能包裝到它自己核心,一般不需要再執行它.

BEGIN_MESSAGE_MAP 為自定接收訊息,訊息一到就會自動呼叫指定的函式.

你使用 cvWaitKey()函数 后,BCB Application->OnMessage 已經取不到消息.
[解决办法]
探讨
3、对windows系统消息的疑惑,我对屏保消息的捕获测试中发现,如果焦点在我的窗体上,那我的程序就能拦截到屏保消息,让系统不产生屏保。但是,如果焦点不在我的窗体上,那是拦截不到的。
所以,我就产生了疑问,
(1)、系统消息不是以广播形式发给各个程序吧?
(2)、既然他不是广播,那他是先发给当前聚焦窗体,然后再系统进行响应么?他为什么要发给当前聚焦窗体让我们拦截?
-----------你用全局勾子拦截,就不存在这个问题了。

[解决办法]
Application也是一个窗口,只不过是隐藏的。每个窗口都有消息过程。Application收到的消息和主窗体收到的消息是不同的。

VCL Form的应用程序中,Application起着重要的作用,创建主窗体,派发消息等等。

Application->OnMessage是截获Application窗口的消息,而Form中重载WndProc或用消息映射,截获的是Form窗体的消息。

热点排行