2

最後の試みです。URL の下に詳細が記載されている問題を解決しようとしています。URL に記載されている記事を確認しましたが、関連するアイコンを非表示にできません。誰でもアイデアはありますか?

http://www.codeproject.com/Articles/10807/Shell-Tray-Info-Arrange-your-system-tray-icons

http://social.msdn.microsoft.com/Forums/da/vbgeneral/thread/a11faa45-a3ea-4060-8de4-a6bc22e1516d

Windows 音声認識によってロードされるシステム トレイ アイコンを非表示にできるようにしたい (Windows 7 および Windows 8 および Windows Vista の一部として提供されます)。私は C# でそれを行う必要があり、ここ数日間 Google のソリューションを試してきましたが、役に立ちませんでした。次のコードを使用するのが最善の方法のようです。

//上で定義した NotifyIconData 構造体

private void button1_Click(object sender, EventArgs e)
{
    NOTIFYICONDATA pnid = new NOTIFYICONDATA();
    pnid.uCallbackMessage = 0x800;
    pnid.uFlags = 1;
    pnid.hwnd = ???;
    pnid.uID = 1;
    pnid.szTip = null;
    pnid.uFlags |= 2;
    pnid.hIcon = ???;
    pnid.uFlags |= 4;
    pnid.szTip = "Speech Recognition is listening";

    bool b = Shell_NotifyIcon(2, ref pnid);

Shell_NotifyIcon API 関数 (2) の第 1 引数は削除です。問題は、アイコンハンドルを含む疑問符付きの引数を見つける方法がわからないことです。ウィンドウの音声認識ショートカットと、タスク マネージャーのファイルの場所 (%windir%\Speech\Common\sapisvr.exe -SpeechUX) で示されるファイルの場所によって示される実行可能ファイルを使用して ExtractIcon を使用しようとしましたが、実行可能ファイルに関連するアイコンはありません。また、その実行可能ファイルのアイコンを確認するためにダウンロードした無料のアプリケーションでも確認しましたが、同じことを言いました。

以下を使用して、アイコン トレイのウィンドウ ハンドルを取得できます。

    IntPtr hWnd = Win32API.FindWindow("Shell_TrayWnd", null);
    if(hWnd.ToInt32() > 0)
        {
            hWnd = Win32API.FindWindowEx(hWnd, IntPtr.Zero, "TrayNotifyWnd", null);
            if (hWnd.ToInt32() > 0)
            {
                hWnd = Win32API.FindWindowEx(hWnd,IntPtr.Zero, "SysPager", null);
                if (hWnd.ToInt32() > 0)
               {
                    hWnd = Win32API.FindWindowEx(hWnd, IntPtr.Zero, "ToolbarWindow32", null);
                }                    
               // count = Win32API.SendMessage(hWnd, 1048 , 0, 0);
            }
        }

ただし、ハンドルとアイコンの数を使用しても、アイコンハンドルを列挙する方法がわかりません。

Windows 7 と Windows 8 で無料で提供される Windows 音声認識をロードすることで簡単に試すことができ、アイコンが表示されます。C++ ソリューションを使用することもできますが、完全にマネージド C++ (.NET) にする必要があります。

4

1 に答える 1

1
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr hWndParent, IntPtr hWndChildAfter, string lpClassName, string lpWindowName);

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

static IntPtr GetSystemTrayHandle()
{           
    IntPtr hWndTray = FindWindow("Shell_TrayWnd", null);
    if (hWndTray != IntPtr.Zero)
    {
        hWndTray = FindWindowEx(hWndTray, IntPtr.Zero, "TrayNotifyWnd", null);
        if (hWndTray != IntPtr.Zero)
        {
            hWndTray = FindWindowEx(hWndTray, IntPtr.Zero, "SysPager", null);
            if (hWndTray != IntPtr.Zero)
            {
                hWndTray = FindWindowEx(hWndTray, IntPtr.Zero, "ToolbarWindow32", null);
                return hWndTray;
            }
        }
    }

    return IntPtr.Zero;
}

ウィンドウ ハンドルを取得したら、プロセスを反復処理してシステム トレイにあるプロセスを見つけ、必要な作業を行うことができます。

using System.Diagnostics;
Process [] processes = System.Diagnostics.Process.GetProcesses();

foreach (System.Diagnostics.Process process in processes)
{
    if (process.MainWindowHandle == hWndTray)
    {
        // ...
    }
}
于 2013-01-08T23:45:04.430 に答える