关于在线程中截取窗口消息的问题
时间:2011-12-23
来源:互联网
C/C++ code
//OnInitDialog函数中 //... //创建一个定时刷新屏幕的线程 HANDLE hThd = ::CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)CFW_111222Dlg::ThdRefrush, (LPVOID)this, 0, NULL); ::CloseHandle(hThd); //... //进程函数,把对话框对象作为参数 DWORD WINAPI CFW_111222Dlg::ThdRefrush(LPVOID lpParameter) { CFW_111222Dlg* pThis = (CFW_111222Dlg*)lpParameter; while(true) { MSG msg; ::PeekMessage( &msg, pThis->m_hWnd, 0, 0, PM_NOREMOVE); if(WM_CLOSE == msg.message) break; //渲染 CFWDevice* pDevice = pThis->m_dlgPkgM.GetGraphDev(); if(NULL != pDevice) if(pDevice->IsInit()) pDevice->Render(); }//while true return(0); }
作者: opower 发布时间: 2011-12-23
作者: zengwenfu 发布时间: 2011-12-23
作者: VisualEleven 发布时间: 2011-12-23
如果你一定要使用WM_CLOSE消息的话,你只能用HOOK。
作者: chayedanwc 发布时间: 2011-12-23
// MainWindow CreateThread.
g_bThreadActived = TRUE;
CreateThread(...);
// Thread Function
while (g_bThreadActived)
{
// do render.
}
// MainWindow
// ON WM_DESTRORY
g_bThreadActived = FALSE;
作者: Saleayas 发布时间: 2011-12-23
像楼主的程序那样?
作者: Saleayas 发布时间: 2011-12-23
C/C++ code
HHOOK m_hHook; HWND h; WNDPROC oldProc; LRESULT CALLBACK HookWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { LRESULT rc = CallWindowProc( oldProc, hWnd, uMsg, wParam, lParam ); if (uMsg==WM_CLOSE) { TRACE("Close dlg"); } if (uMsg==WM_NCDESTROY) UnhookWindowsHookEx(m_hHook); return rc; } LRESULT CALLBACK SetHook(int nCode,WPARAM wParam,LPARAM lParam) { if (nCode==HC_ACTION)[code=C/C++]
{
CWPSTRUCT* pwp = (CWPSTRUCT*)lParam;
if (pwp->message==WM_INITDIALOG)
oldProc=(WNDPROC)SetWindowLong(pwp->hwnd,GWL_WNDPROC,(LONG)HookWndProc);
}
return CallNextHookEx(m_hHook,nCode,wParam,lParam);
}
[/code]
在程序最初始的位置设置HOOK,例如在构造窗体的时候CxxxxDlg(CWnd* pParent = NULL);
C/C++ code
m_hHook = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)SetHook, NULL, GetCurrentThreadId());
在HOOK截获到了WM_CLOSE消息后,使用PostThreadMessage向你的线程发送消息,例如你可以自定义一个WM_USER+100的消息;然后再线程中截获这个消息,并终止该线程。也可以是WM_QUIT消息直接终止线程。
作者: chayedanwc 发布时间: 2011-12-23
C/C++ code
HHOOK m_hHook; HWND h; WNDPROC oldProc; LRESULT CALLBACK HookWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { LRESULT rc = CallWindowProc( oldProc, hWnd, uMsg, wParam, lParam ); if (uMsg==WM_CLOSE) { TRACE("Close dlg"); } if (uMsg==WM_NCDESTROY) UnhookWindowsHookEx(m_hHook); return rc; } LRESULT CALLBACK SetHook(int nCode,WPARAM wParam,LPARAM lParam) { if (nCode==HC_ACTION) { CWPSTRUCT* pwp = (CWPSTRUCT*)lParam; if (pwp->message==WM_INITDIALOG) oldProc=(WNDPROC)SetWindowLong(pwp->hwnd,GWL_WNDPROC,(LONG)HookWndProc); } return CallNextHookEx(m_hHook,nCode,wParam,lParam); }
在程序最初始的位置设置HOOK,例如在构造窗体的时候CxxxxDlg(CWnd* pParent = NULL);
C/C++ code
m_hHook = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)SetHook, NULL, GetCurrentThreadId());
作者: chayedanwc 发布时间: 2011-12-23
MSG msg;
::PeekMessage( &msg, pThis->m_hWnd, 0, 0, PM_NOREMOVE);
这里面要先判断pThis,更好的办法是使用一个信号量。
作者: jennyvenus 发布时间: 2011-12-23
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28