Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用PInvoke更改任务栏图标_C#_Pinvoke_Taskbar - Fatal编程技术网

C# 使用PInvoke更改任务栏图标

C# 使用PInvoke更改任务栏图标,c#,pinvoke,taskbar,C#,Pinvoke,Taskbar,我有一个启动窗口化进程的应用程序。我已成功地通过以下方式更新了窗口图标以及使用Alt+Tab时显示的图标: public class ProcessLauncher { ... [DllImport("user32.dll")] private static extern int SendMessage(IntPtr hwnd, int message, int wParam, IntPtr lParam); private const int WM_SET

我有一个启动窗口化进程的应用程序。我已成功地通过以下方式更新了窗口图标以及使用Alt+Tab时显示的图标:

public class ProcessLauncher {

    ...

    [DllImport("user32.dll")]
    private static extern int SendMessage(IntPtr hwnd, int message, int wParam, IntPtr lParam);

    private const int WM_SETICON = 0x80;
    private const int ICON_SMALL = 0;
    private const int ICON_BIG = 1;

    public void LaunchProcess() {

        var process = new Process();
        var startInfo = new ProcessStartInfo
            {
                FileName = "cmd.exe",
                Arguments = "C:"
            };
        process.StartInfo = startInfo;
        process.Start();

        Thread.Sleep(50);

        var icon = Resources.MyIcon;

        SendMessage(process.MainWindowHandle, WM_SETICON, ICON_BIG, icon.Handle);
        SendMessage(process.MainWindowHandle, WM_SETICON, ICON_SMALL, icon.Handle);
    }

    ...
}

这很好,但该进程的任务栏图标保持不变。如何更新任务栏图标以匹配我为窗口和Alt+选项卡提供的图标?

这是什么版本的Windows?注意:对于固定在Windows 7/8/10任务栏上但未运行的程序,您不能更改任务栏图标。@Dai该进程是我的应用程序启动的进程,而不是固定或未运行的进程。我已经更新了我问题中的代码来反映这一点。代码看起来很假,所以答案不可靠。但最基本的问题是,在进程有机会创建窗口之前,代码使用MainWindowHandle属性的时间太早了。添加process.WaitForInputIdle.Ok,我再次更新了我的示例。除了为我的图标名和ProcessStartInfo.Arguments提供伪值之外,我发布的代码都不是假的。尽可能清楚地说,我的代码按照我的预期工作。这个过程启动得很好。“进程”窗口将正常打开。该进程的窗口标题栏图标会很好地更新。使用Alt+Tab在应用程序窗口之间切换时显示的图标显示良好。只有任务栏图标不显示。它显示为Windows徽标。有没有办法更新我的应用程序启动过程的任务栏图标?我想我应该创建一个单独的控制台应用程序,它只创建一个cmd.exe进程,然后等待它返回。然后你可以给你的主机应用你的图标,避免所有的黑客攻击。