我创建了一个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
。