如何获取后台MFC应用程序的热键以显示



我创建了一个MFC应用程序,如果我按下热键,该应用程序可以隐藏(SHIFT+W(或显示(SHIFT+a(。默认情况下,它在启动时是隐藏的。我搜索解决方案并找到它:

// OnPaint to paint the app and hide
void CAppDlg::OnPaint()
{
ShowWindow(SW_HIDE);
}
// Register the Hotkey when app startup
BOOL CAppDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
RegisterHotKey(CAppDlg::m_hWnd, 1001, MOD_SHIFT, 'A');
RegisterHotKey(CAppDlg::m_hWnd, 1002, MOD_SHIFT, 'a');
}
// Get SHIFT+W to hide app again
BOOL CAppDlg::PreTranslateMessage(MSG* pMsg){
if (pMsg->message == WM_KEYDOWN){
if (pMsg->wParam == 0x57){
if (GetKeyState(VK_SHIFT) & 0x8000) {
ShowWindow(SW_HIDE);
}   
}
}
return CDialog::PreTranslateMessage(pMsg);
}
// Get hotkey id (SHIFT+A) to show app
LRESULT CAppDlg::OnHotKey(WPARAM wParam, LPARAM lParam){
if (wParam == 1001 || wParam == 1002){
ShowWindow(SW_SHOWNORMAL);
}
return 0;
}

此应用程序在启动时将隐藏,函数ShowWindow(SW_HIDE)必须在OnPaint()函数中声明,如果在OnInitDialog()中声明,则不会隐藏。但是,如果我按SHIFT+A来显示窗口,它会立即显示和隐藏(因为OnPaint()功能被调用(。我现在该怎么办?感谢所有

以下是如何隐藏基于对话框的MFC应用程序的主窗口。

bool成员变量添加到对话框类:

bool m_bFirst = true;

WM_WINDOWPOSCHANGING消息的处理程序添加到您的BEGIN_MESSAGE_MAP:

ON_WM_WINDOWPOSCHANGING()

并在头文件中声明

afx_msg void OnWindowPosChanging(WINDOWPOS* lpwndpos);

您可以使用类向导将其添加到您的类中。

在处理程序中,强制使用一个标志来隐藏窗口,直到您得到第一条热键消息:

void CMFCApplicationDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos)
{
if (m_bFirst) {
lpwndpos->flags &= ~SWP_SHOWWINDOW;
lpwndpos->flags |= SWP_HIDEWINDOW;
}
CDialogEx::OnWindowPosChanging(lpwndpos);
}

最后在WM_HOTKEY处理程序中重置该标志:

void CMFCApplicationDlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)
{
if (nHotKeyId == 1001) {
m_bFirst = false;
ShowWindow(SW_SHOW);
}
else if (nHotKeyId == 1002)
ShowWindow(SW_HIDE);
}

注意:

我强烈建议不要对热键使用简单的MOD_SHIFT修饰符:您将无法再在任何其他应用程序中键入大写A

相关内容

  • 没有找到相关文章

最新更新