potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。

C#

C# 10&WinForms AutoScrollによるスクロールバーのスクロールを即座に反映する

ScrollableControlはAutoScrollとScrollイベントの処理を組み合わせることでスクロールを即座に反映できます。FlowLayoutPanelの縦スクロールであれば次のようになります。 private void flowLayoutPanel1_Scroll(object sender, ScrollEventArgs e) { if (e…

C#9&Win API リストビューの内容をCSVへ出力する

リストビューの内容をCSVへ出力するサンプルコードです。リストビューのColumnsやItemsは特殊なコレクションクラスなのでLINQを適用できませんが、Cast<T>で対応するクラスのIEnumerable<T>へ変換すればLINQを適用できます。クラスなので参照コピーで済むと思いま</t></t>…

C# 9 システムフォルダに存在するOS DLLを取得する

C# 9 システムフォルダに存在するOS DLLを取得するサンプルコードです。バージョン情報の製品名が「Microsoft® Windows® Operating System」のDLLをOS DLLとみなしています。 using System; using System.Diagnostics; using System.IO; using System.Linq; …

C# 9&Win API システムメニューを表示する

システムメニューを表示するサンプルコードです。 #nullable enable using System; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; static class Program { [STAThread] static void Main() { Application.SetHi…

C# 9&Win API ウィンドウのクライアント領域のボタン降下でウィンドウを移動させる

ウィンドウのクライアント領域のボタン降下でウィンドウを移動させるサンプルコードです。ウィンドウはシステムに対してカーソルの位置を自身のWM_NCHITTESTメッセージで指定できることを利用します。 #nullable enable using System; using System.Drawing;…

C# 9 リストビューの高速化ならItems.AddRangeも選択肢

リストビューに大量のアイテムをListView.Items.Addメソッドで追加していたら律速になっていました。仮想リストビューも一つの手ですが、項目が多い場合はListView.Items.AddRangeで高速化できる場合があります。 listView1.BeginUpdate(); // infosという配…

C# 9 Unicode範囲の名前と長さを列挙する

C#

.NET 5ではSystem.Text.Unicode名前空間にUnicodeRangeクラス、UnicodeRangesクラスがあります。UnicodeRangeクラスはUnicode範囲の開始コードポイントと長さ、UnicodeRangesクラスは静的プロパティとして名前付きのUnicodeRangeクラスを多数公開しています…

C# 9 バイト配列からメモリ上の読み枠を広げた整数配列を作成する

C#

#nullable enable using System; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; [MethodImpl(MethodImplOptions.AggressiveInlining)] static uint[] CreateUInt32ArrayRough(ReadOnlySpan<byte> value) => MemoryMarshal.Cast<byte, uint>(v</byte,></byte>…

C# 9.0&Win32 API レジストリからプロパティシステムの拡張子情報を取得する

レジストリからプロパティシステムの拡張子情報を取得するサンプルコードです。情報源はMicrosoftの公式ドキュメントです。 ドキュメントの記載に従い、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\PropertySystem\PropertyHandlersに登…

C# 9&Win API カレントユーザーのレジストリに登録された実行ファイルのAppIDを取得する

カレントユーザーのレジストリに登録された実行ファイルのAppIDを取得するサンプルです。HKEY_CLASSES_ROOT\AppIDレジストリキーのうち、キー名が{GUID}形式ではないキーを扱います。AppIDレジストリキーの詳細はMicrosoft Docsを参照ください。 // 必要なNu…

C# Spy++とメッセージを監視するアプリケーションの対象プラットフォームは揃える

Spy++でアプリケーションのメッセージを監視する場合はそれらの対象プラットフォームを揃える必要があります。対象プラットフォームが異なる場合、Spy++はメッセージを監視できません。詳細はIntroducing Spy++ - Visual Studio | Microsoft Docsを参照して…

C#&Win32 API ソートマークやスプリットボタンに対応したリストビューコントロール(ListViewEx)

リストビュー(ListView)から派生してソートマークやスプリットボタン(ドロップダウン用)に対応したリストビューコントロールのコードです。 Program.cs ListViewEx.cs 関連記事 Program.cs using System; using System.Drawing; using System.Windows.Fo…

C#&Win32 API Win32 APIのRECT構造体と.NET 5.0のRectangle構造体は互換性がない

Win32 APIのRECT構造体と.NET 5.0のRectangle構造体は互換性がありません。C#でRECTを使う場合、一度RECTとして取得してからRectangleへ変換する必要があります。 C#のRECT構造体ラッパー // [StructLayout(LayoutKind.Sequential)] struct RECT { public in…

C#10&Win32 API リストビューのヘッダーにソートマークやドロップダウン(スプリットボタン)を表示する

概要 Program.cs ListViewHeaderUtility.cs 概要 標準コントロールのリストビューはWin32 APIのリストビュー(コモンコントロール)を元に作成されています。したがって、ListView.Handleを使えばWin32 APIのリストビューと同様の手順でソートマークやスプリ…

C# 9.0 SpanとMemoryの比較

C#

C# 9.0、System.Memory名前空間のSpanとMemoryの比較です。SpanがIEnumerableに変換できず苦労したことから、現在はMemoryびいきの内容になっています。ReadOnlySpan、ReadOnlyMemoryに関しては適宜読み替えてください。 項目 Span Memory 種類 ref struct s…

C# imageres.dll.munからProgressRingのリソース(PNGデータ)を読み込む

動作確認環境:C# 9.0 preview C#でimageres.dll.munからProgressRingのリソースのPNGデータを読み込むサンプルコードです。実際には複数のPNGリソースが保管されているため、代表としてリソースID 5021を読み込んでいます。 Win32APIのLockResource関数はリ…

C# 匿名型と「is not {...} x」パターンマッチングのサンプルコード

C#

動作確認環境:C# 9.0 「++C++; // 未確認飛行 C」に匿名型とis not {...} x形式パターンマッチングの記事(リンクは記事末尾)がありました。どちらも使ったことがなかったので、自分用のサンプルコードとして。 using System; // 匿名型の作成 var t = new…

C# Win32エラーコードをHRESULTへ変換する関数GetHRForWin32Error

C#

動作確認環境:C# 8.0(.NET Core 3.1)、9.0(.NET 5.0) Win32エラーコードをHRESULTへ変換する関数です。System.Runtime.InteropServices.MarshalクラスはDllImport属性の付いた関数の最終エラー(呼び出し直後のGetLastError関数の結果)からHRESULTへ変…

C# レコードにCreate静的メソッドを持たせる

C#

動作確認環境:C# 9.0(.NET 5) レコードは特殊なクラス(参照型の複合型)であり、クラス同様の静的メソッドを持つことができます。これを利用してインスタンスの作成を試行するCreate静的メソッドを実装できます。クラスの当たり前はレコードでも可能であ…

C# 9.0 複合型に加わったレコード

C#

C#の複合型は構造体とクラスの2種類であり、C# 8までキーワードはclassとstructだけでした。C# 9.0からはここにrecordキーワードが追加されました。recordの実体は特別扱いされるクラスです。 型の分類を表にすると以下のような状態かと思います。レコードは…

C# 9.0 Windows 10の拡張子の分類情報等を取得する

Windows 10で拡張子の分類情報など(Perceived Type等)を取得するにはWin32APIのAssocGetPerceivedType関数を使用します。以下はそのサンプルコードです。recordやnew (...)を使用しているのでC# 9.0以降対応です。 using System; using System.Runtime.Int…

C#言語関係

C#

このブログのC#言語記事のまとめページです。ページ名の前に8、9、8-9がある場合、そのバージョン(C# 8、9、8-9)で動作確認しています。 言語機能 文字列 コレクション・LINQ 実行ファイル プラットフォーム呼び出し(P/Invoke)全般 その他 Windows開発 …

C# isによる3種類のパターンマッチング

C#

動作確認環境:C# 9.0(.NET 5.0) isによるパターンマッチングの概要と具体例です。 概要 isパターン 概要 型パターン 式の型キャスト結果を変数に保持してキャスト可否を返却する。 定数パターン 式が定数式を満たすか判定する。 varパターン 式の結果をロ…

C# 9.0 ushortのushort範囲制限加減算

C#

ushort型の加減算のはみ出し switch式による加減算はみ出しの抑制 isのvarパターンによるはみ出し抑制 Math.Clampによる例 ushort型の加減算のはみ出し ushort型はint型として加減算されるため、計算結果がushortの範囲(0-0xffff)をはみ出す場合があります…

C# WinAPIを使ったHLS色構造体

動作確認環境:C# 9.0(.NET 5) WinAPIを使ったHLS色構造体のコードです。Color型およびタプル(Tuple<ushort, ushort, ushort>およびValueTuple<ushort, ushort, ushort>)との相互変換をサポートしています。Colorとは異なりひとつの整数で表すことを前程としないため、IComparableおよびIComparable<T>は実装</t></ushort,></ushort,>…

C# 9.0 P/Invokeで使う構造体の管理方法いくつか

C#ではP/Invokeで使う構造体をいくつかの方法で実装できます。ここでは実用性は別としていくつかの方法を紹介します。ボックス化の回避などは割愛しています。 構造体として扱う 通常の構造体 読み取り専用構造体 絶対サイズ指定の構造体 絶対サイズ指定の読…

C# 9.0 メモリ割り当て文字列のカスタムマーシャラー

はじめに カスタムマーシャラー CoTaskMem→Unicode文字列 HLOCAL→Unicode文字列 FormatMessageWの例 参考 はじめに C#では以下の手順でアンマネージ関数のP/Invoke時にマーシャリングをカスタマイズできます。 ICustomMarshalerインターフェイスを実装したク…

C# 絶対サイズ指定の構造体は全体コピーされる

C#

C# 9.0ではStructLayout属性のSize引数を指定した構造体は通常のコピーでも全部(Sizeバイト分)コピーされます。P/Invoke以外ではメンバー変数のカバー範囲だけコピーされるかと思っていましたが、カバー範囲外もコピーされていました。Win32 APIのVARIANT…

C# プロパティシステムのサンプルコード

C# .NET5.0(.net5.0-windows)でWindowsのプロパティシステムの情報を操作する自分用のサンプルコードを記録しています。 シェルアイテムのプロパティの名前から値(PROPVARIANT)を取得する。 シェルアイテムのプロパティの名前から値(書式化文字列)を取…

C# Math.NET Numericsで正規分布に従う乱数の発生と平均の標準誤差の推定量計算

C#

C#ではGitHubでMITライセンス公開されているMath.NET Numericsを使用して、正規分布に従う乱数の発生と記述統計量の計算ができます。計算できる記述統計量には不偏標準偏差も含まれるため、以下のようにして正規分布に従う乱数から平均の標準誤差の推定量を…