感谢mwy654321(无条件为你)了其实都是别人发贴提的问题1、隐藏和恢复托盘区任一个图标(如“音量”):
   (原问题在http://topic.csdn.net/u/20080412/22/5fb2b4f2-3409-4aeb-b815-2f4f7afe46e0.html)    我用SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0)可以成功返回图标的个数
    但是SendMessage(hWnd, TB_HIDEBUTTON, 音量图标的ID, 0);却无法隐藏,总是隐藏最右一个图标(NOD32杀毒软件)    请教您是如何实现的?
2、(原问题在)http://topic.csdn.net/u/20080409/14/2d43492c-725a-43db-ab44-4f3bec08760c.html    请问,如果不用全局鼠标钩子,如何实现?(全局钩子的方法我可以做,就不必回答了)谢谢!全当我替上述二贴的提问者加分了。顺便为我解惑
再次感谢!^_^

解决方案 »

  1.   

    亲自为你写了一个程序,下载地址:www.mwymwy.cn/1.rar带源码的,希望您喜欢!
      

  2.   

    CSDN新版有BUG......
    明明看到有2条回复,却打不开.....只好回个贴再看.....
      

  3.   

    晕...CSDN竟然提示“发贴一天后才可以加分”?
      

  4.   

    刚刚发现,原来你两个问题对应的地址不是同一个地址。你第二个问题有两个消息可以解决。不用全局钩子。其实提问者的问法有些不妥,应该问“窗体失去焦点事件如何写?”因为在外面单击主窗体肯定失去焦,所以在失去焦点的事情里面写就可以了。而在内部单击,有自带的Form单击事件啊!如果他的问题改“如何获取鼠标的移动位置是否在窗体内?”,那么可以判断坐标,也可以不判断坐标,类似的有MouseEnter和MouseLeave之类的消息。
      

  5.   

    function   GetSysTrayWnd:   HWND;
    begin
        result := FindWindow('Shell_TrayWnd',nil);
        result := FindWindowEx(result,0,'TrayNotifyWnd',nil);
        result := FindWindowEx(result,0,'SysPager',nil);
        result := FindWindowEx(result,0,'ToolbarWindow32',nil);
    end;procedure FreeIcon;
    var
      ShellHandle: THandle;
      PID: THandle;
      PRC:   THandle;
      Buff: pchar;
      i,Count: integer;
      Info:   _TBBUTTON;
      R:   Cardinal;
      S:   array[0..1024]   of   char;
    begin
      ShellHandle := GetSysTrayWnd; //得到托盘处句炳
      GetWindowThreadProcessId(ShellHandle,   @PID);
      PRC := OpenProcess(PROCESS_VM_OPERATION   or   PROCESS_VM_READ   or   PROCESS_VM_WRITE,   False,   PID);
      Buff:=VirtualAllocEx(PRC,   nil,   4096,   MEM_RESERVE   or   MEM_COMMIT,   PAGE_READWRITE);
      Count := SendMessage(ShellHandle,   TB_BUTTONCOUNT,   0,   0);
      for i := 0 to Count - 1 do
      begin
        FillChar(Info,   SizeOf(Info),   0);
        WriteProcessMemory(PRC,   Buff,   @Info,   SizeOf(Info),   R);
        SendMessage(ShellHandle, TB_GETBUTTON, i,integer(Buff));
        ReadProcessMemory(PRC,   Buff,   @Info,   SizeOf(Info),   R);
        SendMessage(ShellHandle,   TB_GETBUTTONTEXT,   Info.idCommand,   integer(integer(@Buff[0])   +   SizeOf(Info)));
        ReadProcessMemory(PRC,   Pointer(integer(@Buff[0])   +   SizeOf(Info)),   @S[0],   SizeOf(S),   R);
        SendMessage(ShellHandle,TB_HIDEBUTTON,i,1); //改成SendMessage(ShellHandle,TB_HIDEBUTTON,i,0)就是显示了
        SendMessage(ShellHandle, TB_AUTOSIZE, 0, 0)
      end;
      VirtualFreeEx(PRC,   Buff,   0,   MEM_RELEASE);
      CloseHandle(PRC);
    end;
      

  6.   

    另外请楼主看一下这个地址
    http://www.why100000.com/Htmls/_bian_cheng_zhuan_qu435.htm
      

  7.   

    非常感谢suiyunonghen
    嗯,是的,那段代码网上流传很广的,我一直没有调试通过并且现在仍然有点问题就是:在SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0)返回的图标个数中,包括被系统隐藏的几个图标----这些图标是?它们所在的位置顺序是?但已经结贴了,我将在以后再提问。
    谢谢二位
      

  8.   

    呵呵,里面有重复的,和空的
    另外,注意,我刚刚看了下mwy654321的代码
    他的代码并不能隐藏托盘的图标,只不过是得到托盘而已。
      

  9.   

    恩!给mwy654321正宗道歉!
    代码,我没有测试清楚!是可以隐藏的!但是有的图标我还是没有隐藏成功!遗憾!
      

  10.   

    隐藏图标的问题!看看我发的这个图就知道了,呵呵http://p.blog.csdn.net/images/p_blog_csdn_net/suiyunonghen/未命名.jpg