求助:消息、消息...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 已取不到消息.
[解决办法]
[解决办法]
Application也是一个窗口,只不过是隐藏的。每个窗口都有消息过程。Application收到的消息和主窗体收到的消息是不同的。
VCL Form的应用程序中,Application起着重要的作用,创建主窗体,派发消息等等。
Application->OnMessage是截获Application窗口的消息,而Form中重载WndProc或用消息映射,截获的是Form窗体的消息。