CefSharpでポップアップウィンドウのアイコンを変更する。LifeSpanHandlerとWin32APIを使ってFormをコントロールする
前回、ILifeSpanHandlerを使ってポップアップを自前のフォームで制御できることを書きました。
上記の場合だと、親子のwindowオブジェクトの連携が取れなくなり、公式でも非推奨なので、親子連携がないパターンくらいでしか使えないかなと思ったのが正直なところでした。
今回は、CefSharpで自動的に生成されるポップアップのFormをどうやって制御するかという内容を取り上げます。
今回やっていくのは
①ポップアップで開かれるWindowのアイコンを変更すること
②ポップアップで開かれるwindowを最大化して開く
です。
本来自分でFormを実装しているのであれば、上記した内容は簡単に実現できます。
Formのプロパティに必要なパラメータを設定すればOKなので。
例えばFormのアイコンを変えたい場合は、以下のプロパティを変更すればいいですよね。

ポップアップのアイコンを制御するためにはWin32APIを使う必要がある。
CefSharpが自動的に生成するFormに対してアイコンを設定したり、画面を最大化したりするためにはWin32APIを使用する必要があります。
いつもは.NETが各種イベントを制御してくれているので、私もこういう機会がないとWin32APIを触ることがないので、あまり理解していなかったので、まずはざっくり理解していくために、いくつかググりました。
今回は、私自身がWin32APIを解説できるまで詳しくないということがあるので、内容についてはノータッチです。
ちなみに、理解の助けになったのが以下サイトです。
https://tech.sanwasystem.com/entry/2015/11/25/171004
そもそも今回業務で必要だったのは
①ポップアップで開かれるWindowのアイコンを変更すること
でした。
色々とググって検索していると、CefSharpのポップアップでアイコンを変更するためにはWin32APIを使う必要があるということがわかりました。
参考にしたサイト
https://www.magpcss.org/ceforum/viewtopic.php?f=6&t=11814
こちらでは、CefSharpで立ち上がるポップアップの画像を変更するにはWin32APIを使用する必要があることが書かれています。
そのあと、どうやってFormのアイコンを変えるか探した結果行きついたサイトがこちら。
https://stackoverflow.com/questions/9199523/is-there-a-way-to-have-my-app-push-its-icon-to-other-apps
こちらはCefSharpとは関係なく、他アプリのFormのアイコンを変更する方法が書かれています。
CefSharpで上がってくるPopupも捉え方を変えれば、他アプリのFormのIconを変えることと同じことをすればよいということになります。
ソース
上記を元に実装してみた結果、うまく動いたのでソースを公開します。
以下がそのソース。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | using System; using System.Drawing; using System.IO; using System.Runtime.InteropServices; using CefSharp; namespace WinFormsCefSharpSample.ChangePopupIconSample { class LifespanHandler : ILifeSpanHandler { public bool OnBeforePopup(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser) { newBrowser = null ; return false ; } /// <summary> /// Win32APIのSendMessage(Formのアイコンを変更するために使用する) /// </summary> /// <param name="hwnd">送信先ウィンドウのハンドル</param> /// <param name="message">メッセージ</param> /// <param name="wParam">メッセージの最初のパラメータ</param> /// <param name="lParam"></param> /// <returns></returns> [DllImport( "user32.dll" )] private static extern int SendMessage(IntPtr hwnd, int message, int wParam, IntPtr lParam); /// <summary> /// Win32APIのShowWindowAsync(画面サイズを最大化させるために使用) /// </summary> /// <param name="hwnd"></param> /// <param name="nCmdShow"></param> /// <returns></returns> [DllImport( "user32.dll" )] public static extern int ShowWindowAsync(IntPtr hwnd, int nCmdShow); private const int WM_SETICON = 0x80; private const int ICON_BIG = 1; private const int SIZE_MAXIMIZED = 3; public void OnAfterCreated(IWebBrowser chromiumWebBrowser, IBrowser browser) { try { var windHandler = browser.GetHost().GetWindowHandle(); // winformのアイコンを変更する using ( var icon = new Icon(Directory.GetCurrentDirectory() + @"\ChangePopupIconSample\myIcon.ico" )) { SendMessage(windHandler, WM_SETICON, ICON_BIG, icon.Handle); } // 画面サイズを最大化する ShowWindowAsync(windHandler, SIZE_MAXIMIZED); } catch (Exception e) { Console.WriteLine(e); } } public bool DoClose(IWebBrowser chromiumWebBrowser, IBrowser browser) { return false ; } public void OnBeforeClose(IWebBrowser chromiumWebBrowser, IBrowser browser) { } } } |
ディスカッション
コメント一覧
まだ、コメントがありません