【问题标题】:How to change window icon by invoking winapi in C#如何通过在 C# 中调用 winapi 来更改窗口图标
【发布时间】:2019-09-09 15:01:57
【问题描述】:

我正在尝试使用 WinApi SendMessage() 更改窗口图标,但没有成功。

知道这里有什么问题吗?

public void OnAfterCreated(IWebBrowser chromiumWebBrowser, IBrowser browser)
{
    if (!browser.IsDisposed && browser.IsPopup)
    {
        Application.Current.Dispatcher?.Invoke(new Action(() =>
            {

                IntPtr handle = browser.GetHost().GetWindowHandle();
                string getFavIcon = chromiumWebBrowser.Address.Split('#')[0] + "assets/images/MyPic.png";
                var image = new BitmapImage(new Uri(getFavIcon));
                var bitMap = Utilities.BitmapImage2Bitmap(image);
                //IntPtr imagePtr = image.ge
                SendMessage(handle, WM_SETICON, 0, bitMap.GetHbitmap());
                SendMessage(handle, WM_SETICON, 1, bitMap.GetHbitmap());
            })
        );

    }

}

【问题讨论】:

  • 很可能,browser.GetHost().GetWindowHandle() 没有返回分配有图标的顶级窗口,因此您无法在其上设置新图标。跨度>
  • 我取得了一些进展:WM_SETICON 的值错误,我用 GetHicon 替换了 GetHbitmap。现在我有一个黑色图标,有什么想法吗? SendMessage(handle, WM_SETICON, 0, bitMap.GetHicon());

标签: wpf winapi c#-3.0


【解决方案1】:

最后我得到它的工作,我得到黑色图标,因为图像尚未下载。 以下代码是覆盖图标 cefsharp chromium 控件弹出窗口。

//ILifeSpanHandler

private const int WM_SETICON = 0x80;
 public void OnAfterCreated(IWebBrowser chromiumWebBrowser, IBrowser browser)
        {
            if (!browser.IsDisposed && browser.IsPopup)
            {
                Application.Current.Dispatcher?.Invoke(new Action(() =>
                    {
                         _handle = browser.GetHost().GetWindowHandle();
                        var bitMap = Utilities.BitmapImage2Bitmap(Utilities.FavIcon);
                        SendMessage(_handle, WM_SETICON, 0, bitMap.GetHicon());
                    })
                );
            }
        }  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-25
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多