|
本帖最后由 KATZ 于 2020-7-3 17:58 编辑
问题如题, 高级班之窗口篇P5
https://www.bilibili.com/video/BV1Ct411B7Gz?t=3719&p=5(让程序只运行一个实例)
自定义消息中显示对话框无反应/失效。
第五个方法
⑤、互斥体+自定义广播系统消息法;
1、系统消息的注册:
- #define REG_MSG (_T("{7510EF00-BADA-48de-A6CE-5FBC817616DD}"))
- UINT WM_ACTIVE_MSG = ::RegisterWindowMessage(REG_MSG);
复制代码
2、发现实例后,进行消息的广播:
InitInstance() 函数中添加如下代码:
- HANDLE m_hMutex = ::CreateMutex(NULL, FALSE, _T("{6668BB0A-DE0C-499d-8520-79653FF9B2EB}"));
- if ( GetLastError() == ERROR_ALREADY_EXISTS ){
- AfxMessageBox(_T("已经有一个实例正在运行中……"));
- CloseHandle(m_hMutex);
- m_hMutex = NULL;
- DWORD dwRecipients = BSM_APPLICATIONS;
- ::BroadcastSystemMessage(BSF_NOHANG, &dwRecipients, WM_ACTIVE_MSG, 0, 0);
- return FALSE;
- }
复制代码
//清理工作
- if (m_hMutex) {
- CloseHandle(m_hMutex);
- m_hMutex = NULL;
- }
复制代码
3、窗口类中全局变量的作用域扩展:
- extern UINT WM_ACTIVE_MSG;
复制代码
4、窗口类中自定义消息的响应:
- afx_msg LRESULT OnActiveMsg(WPARAM wParam, LPARAM lParam);
- ON_REGISTERED_MESSAGE(WM_ACTIVE_MSG, &CDlgTestDlg::OnActiveMsg)
- LRESULT CDlgTestDlg::OnActiveMsg(WPARAM wParam, LPARAM lParam)
- {
- ::ShowWindow(m_hWnd, SW_NORMAL);
- ::SetForegroundWindow(m_hWnd);
- return TRUE;
- }
复制代码
百度谷歌各种方法都试过 ShowWindow与SetForegroundWindow() 失效 、
无论是不是全局函数按视频操作也都没有正常运行 视频中也没有详细讲解 故发此提问。
直接使用 PostMessage(HWND_BROADCAST, WM_ACTIVE_MSG, 0, 0); 吧,试试,这个广播消息应该可以
|
上一篇: VC设计界面调用matlab子程序下一篇: size_t 定义类时怎么有时可以,有时候不行
|