2014-09-24 76 views
1

我想在应用程序中打开/关闭系统网络图标,就像我们可以通过控制面板执行操作一样。我知道“HideSCANetwork”注册表项,但要使用此解决方案,需要在更改设置后重新启动资源管理器。有没有其他解决方案可以像系统一样无缝完成这项任务?如何以编程方式打开/关闭Windows系统网络图标

Example

+0

应用程序无权这样做,它是用户的专有特权。 – 2014-09-24 03:41:56

+0

在企业环境中,您可以通过GPO禁用,在任何其他环境中保持独立!如果这只是您自己使用,请在更新注册表项后尝试广播WM_SETTINGCHANGE。 – 2014-09-24 10:39:48

回答

1

有做thois没有官方的API。原因是微软希望让用户能够保持通知区域不会变得太满。问题是太多的应用程序启动用户不关心的通知图标。

由于许多用户不知道如何摆脱这些图标,Microsoft决定默认隐藏它们来提供帮助。如果应用程序有权访问这些隐藏/显示设置,那么应用程序会默认显示通知,我们会回到我们开始的位置。因此没有提供以编程方式修改这些设置的机制。

你想做一些不同的事情,听起来同样有恶意,即隐藏一个重要的系统图标。如果您决定这样做,那么您可以反向设计如何存储设置(可能在注册表中)并以此方式更改设置。但是,如果你这样做,你会反对系统设计。

+0

谢谢大卫。我的应用程序(提供网络相关功能)显示与通知区域中的系统网络图标类似的图标。我想在应用程序中创建一个设置项,以便不想看到两个相似图标的用户在应用程序运行期间隐藏系统。 – Shawnone 2014-09-25 02:05:24

0

现在我找到一个不完美的解决方案。其基本思想来自这里: http://www.codeproject.com/Articles/10807/Shell-Tray-Info-Arrange-your-system-tray-icons

一些提示:

  • 该解决方案支持Win 7,你可以删除XP校验码。
  • 在WOW64上,你需要改变结构TRAYDATA和使用TBUTTON64:

    struct TRAYDATA 
    { 
        DWORD64 hwnd; 
        UINT uID; 
        UINT uCallbackMessage; 
        DWORD Reserved[2];  
        DWORD64 hIcon;    
    }; 
    
    typedef struct _TBBUTTON64 
    { 
        int iBitmap; 
        int idCommand; 
        BYTE fsState; 
        BYTE fsStyle; 
        BYTE bReserved[6]; 
        DWORD64 dwData; 
        DWORD64 iString; 
    } TBBUTTON64, NEAR* PTBBUTTON64, *LPTBBUTTON64; 
    typedef const TBBUTTON64 *LPCTBBUTTON64; 
    
  • 当你找到你想隐藏的图标(通过使用提示文本加上所有者的过程),发送TB_HIDEBUTTON消息到通知区域窗口。

不完美的部分是托盘图标将被隐藏,但通知区域不会调整大小。所以通知区域有一个空白区域。

相关问题