投稿

[WinUI 3] WindowのClosingイベントがやっと気軽に使えるようになった!

イメージ
WinUI 3/Project Reunion 0.xでは Window.Closing イベントがなくて、Windowを閉じたときに未保存の注意などを実現するために、 DllImport でWin32 APIを使わざるをえませんでした。 Project ReunionがWindows App SDK 1.0になってから、AppWindow APIを使うことで、簡単にClosingイベントを使えるようになりました! 目次 早速サンプルコード: Windowを閉じようとするとContentDialogを表示させる AppWindow APIを理解する おまけ:AppWindowのTitleBarプロパティでタイトルバーの見た目を変えられる 参考ページ 早速サンプルコード: Windowを閉じようとするとContentDialogを表示させる 必要なnamespace using Microsoft.UI; using Microsoft.UI.Windowing; AppWindow objectを取得する private AppWindow GetCurrentAppWin ( ) { //Windowのハンドルを取得する IntPtr hwnd = WinRT.Interop.WindowNative.GetWindowHandle( this ); //hwndでWindowIdを取得する WindowId winId = Win32Interop.GetWindowIdFromWindow(hwnd); //WindowIdでAppWindow objectを取得して返す return AppWindow.GetFromWindowId(winId); } AppWindow objectを利用してClosing Eventをハンドルする AppWindow thisAppWin = GetCurrentAppWin(); if (thisAppWin != null ) { thisAppWin.Closing += async (s, e) => { //Windowのcloseプロセスをキャンセルす

C# Fontクラスを使うときはこれに注意

イメージ
先日は 新しくパソコンを自作した ので、Windowsもクリーンインストールしました。 いつも使っていた「写真に文字を入れる」自作アプリがあって、新しいパソコンでも普通に使えました。 それが、何日後に出力された写真を使おうとしたら、「あれ?何かが違う!」と感じて、よく見てみたら、写真に描画された文字のフォントが違うではありませんか!? そういえばWindowsをインストールしたけど、そのフォントをまだ入れていないと思い出しました。 フォントが見つからなかったら、なんでエラーが出ないんだろうと不思議に思って、早速コードを調べてみました。 C#のFontクラスにはfallback代替フォントが存在している 指定フォントが見つからないときの挙動 Font Classの公式仕様を調べてみる 指定フォントが見つからないときにエラーを出す方法 Fontが見つからないときにエラーを出すべきかどうか C#のFontクラスにはfallback代替フォントが存在している 指定フォントが見つからないときの挙動 指定のフォントが見つからなかったときはExceptionを投げてくれると期待しました。 string fontName = "My Font" ; Font font = new Font(fontName, 12 ); } /* * fontを使うコード */ わざと存在しないFontを指定して、fontオブジェクトの中身をDebugで見てみよう: Exceptionを出さずに代替フォント Microsoft Sans Serif が自動的に使われています!  Font Classの公式仕様を調べてみる Microsoft DocサイトのFont Classページ に注意書きがありました: If you attempt to use a font that is not supported, or the font is not installed on the machine that is running the application, the Microsoft Sans Serif font will be substituted. やっぱり、サポートされないフォントあるいはインストールされて

Windows SecurityでFull ScanしたらCPU温度が100℃まで上がった件

イメージ
久しぶりにデスクトップPCを自作しました。 少しトラブルが発生しましたので、忘れないうちにメモしておきます。 目次 Core i5-11400が100℃になった経緯 問題と原因分析 2つの問題 パーツの構成 CPUの仕様とMBの初期設定が原因 CPUの使用率が100%でも100℃にならないための対策 基本的な考え方 すぐにとった対策 今後とる予定の対策 予備対策 後書き Core i5-11400が100℃になった経緯 デスクトップパソコンを組み立てて、Windows 10を入れて11にアップグレードして、以前のファイルも移行完了しました。 さてウイルススキャンでもしとこうかと、Windows Securityを起動し、 Full Scan を実行しました。 すると、1-2分経った頃かな、ケースからファンの大きな音がしてきました。 新しいPCですし、ファンの回転数はどれくらいか気になって、HWMonitorを開いて見てみることにしました。 ファンの回転数よりは先に目に入ったのが赤い文字となったCPUコアの温度でした。なんと複数のコアがずらりと 100℃ !!! (少し慌てたためスクリーンショットを撮りませんでした💦) タスクマネージャーを急いで開いたら、全部のコア/スレッドが使用率100%! これはやばいと思い、すぐにウイルススキャンを中止したら、CPUの温度も徐々に40℃台に戻りました。  問題と原因分析 2つの問題 今回の問題は2つに分解できます。 1. Windows SecurityでフルスキャンしたらCPUの使用率が全コアで100%になる これは新しい問題ではありません。 ググってみたら数年前にも報告されており、今でもWindowsのFeedback Hubで多数報告されています。 マイクロソフトはこの問題を解決する予定があるかどうかは不明です。 そもそも、冷静に考えてみますと、これが問題かどうか自体はあいまいです。 「ソフトウェアはCPUの資源を全部使ってはいけません」 というルールがないはずですし、あるとしても、ユーザーが複数のソフトを同時に使う場面では、CPUの使用率が100%になるシナリオが十分あり得ます。 また、Windows SecurityはCPU使用率に関

C#アプリからWindows File Explorerでファイル検索結果を表示する

イメージ
C#のアプリから品番で商品の写真を検索する等、時々WindowsのFile Explorerでファイルの検索結果を表示する必要があります。 アプリ自体は検索結果の表示機能を実装していない場合はWindowsのFile Explorerで検索結果を表示させるのが近道です。 今回は search-ms: プロトコルでの検索方法をメモします。 目次 C#からWindows File Explorerで検索結果を表示する 指定場所でkeywordを検索するC#サンプルコード 構文説明 search-ms プロトコル query=keyword crumb=location:E:\test 他の例 編集された日付指定で検索 編集された日付範囲指定で検索 ファイルの種類で検索 検索方法をさらに広げる C#からWindows File Explorerで検索結果を表示する 指定場所でkeywordを検索するC#サンプルコード string keyword = ".cs" ; string location = "E:\\test" ; string queryString = $@"search-ms:query= {keyword} &crumb=location: {location} " ; ProcessStartInfo processStartInfo = new ProcessStartInfo(queryString); processStartInfo.UseShellExecute= true ; Process.Start(processStartInfo); 構文説明 search-ms プロトコル search-ms: プロトコルを指定すれば、WindowsではデフォルトとしてFile Explorerで検索画面を開く。 search: でも動くようです。 query=keyword 検索するキーワードを指定します。 crumb=location:E:\test 検索する場所を指定します。 他の例 編集された日付指定で検索 string queryString = $@"search-ms:

C#正規表現で文字をReplaceする3つの方法と使い分け

目次 正規表現(Regular expression,Regex)について Regex.Replace()メソッドの3つの使い方 1. 一斉置換の結果だけがほしいときの使い方 2. 個々のMatch結果を見たり処理したいときの使い方 3. 上記2と同じでMatch.Result(replace)を使う方法 少し深堀: Match.Result() でなければならない?シナリオ まずMatchのパターンを変える そしてreplace文字列は開発者指定ではなくユーザー入力で取得する この状況で個々のMatchを追跡しながら一斉置換する まとめ: Match.Result() が必要なシナリオ 正規表現(Regular expression,Regex)について 正規表現は自分にとって不可欠な存在です。非常に頻繁に使います。 パターンの文法はいろいろあるものの、よく使ういくつかを覚えておけば、結構不便なく使えます。 先日はMatchされた文字列の置換(Replace)について、少し困った場面に出遭い勉強になりましたので、ここで整理しておきたいと思います。 Regex.Replace()メソッドの3つの使い方 まず例として以下のinput文字列とパターンがあるとします。 string input = "1月30万円、2月60万円、3月100万円" ; //"30万円","60万円","100万円"をMatchするpattern string ptnAmount = @"(\d+)万円" ; 1. 一斉置換の結果だけがほしいときの使い方 これは一番シンプルです。一斉置換の結果だけほしくて、個々のMatchに興味がない場合: //個々のMatchを追跡せずに一斉置換 string output = Regex.Replace(input, ptnAmount, "${1}0,000円" ); Console.WriteLine( "output:" ); Console.WriteLine(output); 結果出力、ただ置換するだけですので、100万円を超えた場合の表示に

C# WebView2.ExecuteScriptAsync()のいくつかの使い方とDebug方法

イメージ
先日はHTMLページのスクリプトとWebView2の間の通信について触れました。 WebView2を通じてWebサーバーなしでJavaScriptからローカルファイルを読み書き HTMLページそのものは自分が作成したもので、よってスクリプトも自分の好きなようにHTMLファイルで指定できました。 しかし、もしページが自分のサイトでない場合、最初からページスクリプトの指定ができないため、拡張機能のようにContent Scriptをinjectしなければなりません。 WebView2は ExecuteScriptAsync メソッドを提供していますので、いくつかの基本的な使い方を試したいと思います。 目次 WebView2.ExecuteScriptAsyncメソッドの定義 テスト環境の準備 WebView2.ExecuteScriptAsyncメソッドの使い方 1. Script文字列をそのまま実行、戻り値なし。例: <body> 背景色を変更 2. Script文字列をそのまま実行、戻り値あり。例:HTML取得 3. JavaScriptファイルを読み込んで実行、戻り値あり。例: <img> の src を取得 4. JavaScriptファイルを読み込んで実行、戻り値あり、JS側パラメーターあり。例:C#で背景色を指定してJS側で変更 ExecuteScriptAsync を使うときのDebug方法 感想 WebView2.ExecuteScriptAsyncメソッドの定義 Task< string > ExecuteScriptAsync ( string javaScript ) ; 現在WebView2に表示されているページに string javaScript をinjectして実行する。 実行の結果を await すればJSONエンコードされた string が返される。 テスト環境の準備 Visual Studio Community 2022 WinForms プロジェクト@.Net 5 WebView2を初期化する async void InitWebViewAsync ( ) { //WebView2を初期化する await wv

Chrome/Edge拡張機能を作ってブログ記事のHTMLをチェックする

イメージ
目次 背景 何をなぜチェックするのか <img> タグの alt (代替テキスト)属性が設置されているか <img> タグの title 属性を設置しているか <a> (Anchor アンカー)の target 属性が _blank になっているか 拡張機能の完成イメージ エラーの表示方法 チェックレポートのイメージ チェック前後のページ比較 作る前にまず一般的な拡張機能の構成を理解しよう 1. manifest.json(必須) 2. backgroundスクリプト(オプション) 3. Content Script(オプション) 4. Popup(オプション) ブログ記事をチェックする拡張機能を作る 今回の拡張機能の構成 manifest.json Content Script: BloggerPageChecker.ts tscでコンパイルしてブラウザーで開く その他の参考情報 TypeScriptを使う場合は@types/chromeを使うと便利 今から作る拡張機能はManifest V3で作りましょう ブラウザのDevToolsを活用しましょう 後書き 背景 自分はプログラミング言語に関しては、基礎をある程度理解してから、使うときに使う部分だけ勉強するとうスタイルです。 知識の断片をつなぎ合わせてちゃんとプログラムを動作させられても必ずbest practiceとは限りません。 最近ブログの記事を書くにはHTMLをよく扱うようになって、Google Adsenseに申請するためにいろいろ調べたら、HTMLは意外と奥深いことが分かりました。 例えば <img> タグの alt 属性、なくてもブラウザーが許してくれても検索インデックス作りに支障が出るとか、様々なルール・規範があります。 完璧さを追求しないとしても、分かる範囲で極力正しいコードを書こう!という自覚はありますが、人間はミスする動物ですので、ルールを守っているつもりでも忘れたりします。 あとでいちいちチェックするのも面倒ですし、すべてのミスを発見できるとも保証できません。 人間のしたくないことはコンピューターにさせよう! ということで、ブログの記事の