MFC托盘图标双击后界面不在最前面的解决办法

问题描述:

MFC创建托盘图标,存在托盘双击显示界面的方法

如果界面已经打开,但是被其他界面遮挡,双击图标时界面不能显示在最前面


问题原因:

双金完成后没有设置焦点,程序界面非第一焦点,导致无法显示在最前面,将焦点设置一下,即可


解决办法:

若托盘处理方法是在主窗口的类中,在托盘图标的双击事件处理方法的ShowWindow(SW_SHOW)调用后,添加以下两句

SetForegroundWindow();
SetFocus();

如果托盘处理是封装出来的,在获取了主窗口的句柄,则改成以下两句

pWnd->SetForegroundWindow();
pWnd->SetFocus();


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您可以在MFC对话框的OnInitDialog()函数中添加以下代码来实现该功能: ```cpp // 加入以下头文件 #include "Shellapi.h" // 在OnInitDialog()函数中添加以下代码 NOTIFYICONDATA nid; // 定义托盘图标结构体 nid.cbSize = sizeof(NOTIFYICONDATA); nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); nid.hWnd = this->GetSafeHwnd(); nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; nid.uCallbackMessage = WM_USER_SHELLICON; lstrcpy(nid.szTip, _T("您的应用程序名称")); Shell_NotifyIcon(NIM_ADD, &nid); // 在托盘区添加图标 ShowWindow(SW_HIDE); // 隐藏对话框窗口 ``` 此外,您还需要添加以下消息映射函数: ```cpp BEGIN_MESSAGE_MAP(CYourDialog, CDialogEx) // ... ON_MESSAGE(WM_USER_SHELLICON, OnTrayNotification) END_MESSAGE_MAP() LRESULT CYourDialog::OnTrayNotification(WPARAM wParam, LPARAM lParam) { UINT uID; UINT uMsg; uID = (UINT)wParam; uMsg = (UINT)lParam; if (uID != IDR_MAINFRAME) return 0; if (uMsg == WM_RBUTTONUP) { CMenu menu; VERIFY(menu.LoadMenu(IDR_MENU_TRAY)); CMenu* pSubMenu = menu.GetSubMenu(0); ASSERT(pSubMenu != NULL); // 获取鼠标位置,并转换为屏幕坐标 POINT pt; GetCursorPos(&pt); // 显示菜单 SetForegroundWindow(); pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON, pt.x, pt.y, this); PostMessage(WM_NULL, 0, 0); } else if (uMsg == WM_LBUTTONDBLCLK) { ShowWindow(SW_SHOW); // 显示对话框窗口 Shell_NotifyIcon(NIM_DELETE, &nid); // 在托盘区删除图标 } return 0; } ``` 这样,当您的MFC对话框启动时,它将会隐藏在系统托盘区中,并显示您指定的托盘图标。当用户单击托盘图标时,对话框窗口将会显示出来。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值