托盘左键单击和双击问题

最近项目中有个托盘左键单击、双击事件,但发现双击的时候总是先弹出单击的菜单(这个是正常的,因为双击必定先触发单击事件嘛),那如何避免这样的情况呢....

方案1 : 用线程处理单击事件,延时判断,如果是双击,则不显示单击的菜单

首先在 对话框中添加  BOOL m_bLButtonFlag; //  0 表示单击  1 表示双击

然后再  

LRESULT XXX::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 

 case WM_LBUTTONDOWN:
   {
    // 显示菜单

afxbeginthread()...
    

   return TRUE;
   }

  case WM_LBUTTONDBLCLK: // 恢复显示
   {
    m_bLButtonFlag = TRUE;

      ...

  }

然后再线程中处理单击的事件信息

方案2 ,延时处理,SETTIMER(), 在ONTIMER 中处理相应的事件

 if (LOWORD(lParam) == WM_LBUTTONDOWN )
 { 
  SetTimer(111,500,NULL); 
 }

void CMy12314Dlg::OnTimer(UINT nIDEvent)
{
 // TODO: Add your message handler code here and/or call default

    if (m_showflag == false )
   {
    CMenu menu, *pSubMenu;
   if (!menu.LoadMenu(IDR_MENU2)) return ;
  if (!(pSubMenu = menu.GetSubMenu(0))) return;
 
   // Make first menu item the default (bold font)
  // ::SetMenuDefaultItem(pSubMenu->m_hMenu, 0, TRUE);
 
   //Display and track the popup menu
   CPoint pos;
   ::GetCursorPos(&pos);
   ::SetForegroundWindow(nd.hWnd); 
    ::TrackPopupMenu(pSubMenu->m_hMenu, 0, pos.x, pos.y, 0, this->GetSafeHwnd(), NULL);
   }
   else
   {
   m_showflag = true;
   }

 

问题: 在线程中菜单显示一直没解决,后来改用定时器,单击菜单可以正常显示。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在WPF中,要实现托盘双击显示窗体的功能,可以按照以下几个步骤进行操作。 首先,在XAML文件中添加一个System.Windows.Forms的命名空间引用,这是因为托盘图标使用的是Windows Forms的控件。 然后,在XAML文件中添加一个NotifyIcon控件,用于创建托盘图标。可以设置Icon(图标)、Text(鼠标悬停时显示的文本)等属性。 接下来,在窗体的Loaded事件中,使用以下代码实现托盘图标的显示: ```csharp private System.Windows.Forms.NotifyIcon notifyIcon; private void Window_Loaded(object sender, RoutedEventArgs e) { notifyIcon = new System.Windows.Forms.NotifyIcon(); notifyIcon.Icon = new System.Drawing.Icon("icon.ico"); // 设置托盘图标 notifyIcon.Text = "双击显示窗体"; // 设置鼠标悬停时显示的文本 notifyIcon.DoubleClick += NotifyIcon_DoubleClick; // 添加双击事件处理函数 // 显示托盘图标 notifyIcon.Visible = true; } ``` 在双击事件处理函数NotifyIcon_DoubleClick中,可以使用以下代码实现窗体的显示: ```csharp private void NotifyIcon_DoubleClick(object sender, EventArgs e) { this.Show(); // 显示窗体 this.WindowState = WindowState.Normal; // 恢复到正常状态 } ``` 需要注意的是,在窗体的Closing事件中,应添加以下代码,以确保在关闭窗体时托盘图标也被释放: ```csharp private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { notifyIcon.Dispose(); // 释放托盘图标资源 } ``` 通过以上步骤,就可以实现在WPF中双击托盘图标显示窗体的功能了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值