就是右键单击托盘图标,跳出popupmenu ,但是如果你不点popupmenu,而点其他的地方,popupmenu就会一直存在那里.为什么? 我发现有的程序有这样的问题(天网防火墙),有的就没有. 有什么好的解决方案吗?

解决方案 »

  1.   

    弹出菜单的同时启动一Timer,监测鼠标是否移出
      

  2.   

    监测鼠标是否移出还可以不要TIMER的啊。用系统消息可以的
      

  3.   

    我也有同样的问题;我觉得系统消息可能好些,但没有用timer监测容易掌握。
      

  4.   

    你的托盘应该有一个隐藏的主窗体吧,调用SetWindowFront(好像是这样的一个API)把他提到前台就OK了
    看看现成的托盘例子象RxLib也会有答案的
      

  5.   

    这个问题其实如果你想搞明白比较复杂   ,你可以找资料看看,关于子类化窗口的内容,就是说,你自己定义一个窗口过程,用他来接收Windows的消息 ,过滤之后,将必要的消息,交还给程序中的实际窗口处理 。设置系统托盘只需要一个Windows Api,难的是怎么接收系统托盘的消息。
      

  6.   

    如果你不懂怎样设置,怎样用系统托盘图标
    E:\Delphi7\Source\Vcl\ScktSrvr.dpr请分析此源码!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      

  7.   

    托盘我会做.但是就是 出来popupmenu后 ,如果点它以外其他别的地方,popupmenu不会自动消失.  我发现好多delphi做的这类程序有这个问题了.
    timer的那种解决方案中,如果判断出鼠标移出,是用sendmessage或者postmessage发送消息么?发送什么消息?
    另一种消息的解决方案中,是判断什么消息??
      

  8.   

    太简单啦,这样的问题太好拿分啦 ,一个API指令搞定啊:
            GetCursorPos(CursorPos);
            SetForegroundWindow(handle);//在弹出菜单之前执行这个API
            popupmenu1.Popup(CursorPos.x,CursorPos.Y);QQ也存在这个问题。真不知道马总是怎么想的。
      

  9.   

    API函数+系统消息
    var
    nid:tnotifyicondata;
    //////////////////////
    nid.cbSize:=sizeof(nid);
    nid.Wnd:=handle;
    nid.uID:=1;
    nid.hIcon:=application.Icon.Handle;
    nid.szTip:=('something to show');
    nid.uCallbackMessage:=my_message;
    nid.uFlags:=nif_icon or nif_tip or nif_message;
    if not shell_notifyicon(nim_add,@nid) then
    application.Terminate;