potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

C#

C#&Win API MDI子フォームのStatusStripにサイズグリップを強制表示する。

以前の投稿でMDI子フォームはMDI親フォームの最大化時にサイズグリップが非表示になるWinFormsの仕様を紹介しました。この記事ではウィンドウメッセージとToolStripRendererを利用したサイズグリップの強制表示を紹介します。動作確認環境は.NET 8.0ですが、…

C#&WinForms MDI子フォームのStatusStripでサイズグリップが消える。

追伸:解決方法を別の記事に記載しました。 WinFormsでMDI子フォームにStatusStripを置くとMDI親フォームの最大化時にサイズグリップが消えます。GitHub上のソースコードを調べると設計上の仕様です。具体的には次の通りです。 StatusStripはサイズグリップ…

C# WinFormsのクリップボード監視コンポーネント

WinFormsのFormへのクリップボード監視機能の追加、コンポーネントとNativeWindowで思ったより簡単に実装できました。NativeWindowの理解が浅いので問題が残っているかもしれませんが、とりあえず動きはします。動作確認はC# (.NET 8.0)ですが、名前空間など…

C#11 配列の入ったobject型をstring.Joinで結合する

C#

配列の入ったobject型をstring.Join()で結合するにはIEnumerableにキャストしてからOfType<T>()を使います。キャストせず渡すと可変長引数の最初の引数として素直にToString()されます。ちなみにIEnumerableへキャストすると文字列(char[]配列)も分割されるの</t>…

C#&MSVS 17.5.0 Preview 3.0 ユーザーコントロールのobject、nint、nuint型プロパティはプロパティウィンドウで読み取り専用

C#

ユーザーコントロールのobject、nint、nuint型プロパティはプロパティウィンドウで読み取り専用になります。 // UserControl1.Designer.csとUserControl1.resxは既定値なので省略します。 namespace UserControlTest1; public partial class UserControl1 : …

C# クラスに属性でIIDを持たせる

C#

C#ではカスタム属性でクラス自体にIIDを持たせられます。ただし静的メンバーより動作は遅く、Guidのような非標準型は属性定義時の引数に渡せないようです。 using System.Reflection; Console.WriteLine(IIDAttribute.Of<ClassWithIPersistIID>()?.ToString("B") ?? "(未定義)"); C</classwithipersistiid>…

C# HRESULTパターン、例外パターン、Nullableパターンのどれを使うかで悩む

C#

C#で自分用のクラスライブラリを作るとき、最中にもエラー対処パターンで悩みます。COM開発で使えるデザインパターンはおそらくHRESULTパターン、例外パターン、Nullableパターン(適当に名付けました)なのですが、一長一短です。 HRESULTパターン エラーを…

C# ジェネリック関数でEnum型を整数へ変換する

C#

ジェネリック関数ではenum型は通常の方法((int)...)で整数へ変換できません。 Convert.ToInt32やConvert.ToUInt32等を使えばジェネリック関数でもEnum型を整数へ変換できます。 using System; Console.WriteLine(f(Enum1.A)); string f<T>(T t) where T : Enu</t>…

ImageSharpがライセンス変更により.NET財団を離脱

C#

ImageSharpがライセンス変更により.NET財団を離脱したそうです。AngleSharpが.NET財団のメンバープロジェクトであることに安堵していましたが、こういうこともあるみたいです。 経緯や.NET財団のコメントは公式ブログで確認できます。OSSや年間総売上が一定…

AngleSharp、JSON.NET、ML.NET、Infer.NETは.NET財団のプロジェクト

C#

AngleSharp、Json.NET、ML.NET、Infer.NET、気づいたらMicrosoft主導の.NET財団のプロジェクトになっていました。AngleSharpは企業ベースだと思いこんでいたので、これまでより使いやすくなりました。 .NET Bioなどの知らなかったプロジェクトもあるので、時…

C# JPEGファイルEXIFデータのWindows用評価とキーワードを取得・設定・削除する

JPEGファイルEXIFデータのWindows用評価とキーワードを取得・設定・削除するサンプルコードです。 #nullable enable using System; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Runtime.Serialization; using Syste…

C# System.Drawing.Imaging.PropertyDataのインスタンスを作成する

System.Drawing.Imaging.PropertyDataはJPEGファイルのEXIFデータを取得・設定する際に必要ですが、コンストラクタが非公開なので通常の方法ではインスタンスを作成できません。これはSystem.Runtime.Serialization.FormatterServicesのGetSafeUninitialized…

C# P/InvokeとCOM呼び出し時、UnmanagedType.LPWStrは強制的にMarshal.FreeCoTaskMemされる

P/InvokeとCOM呼び出し時、UnmanagedType.LPWStrのMarshal.FreeCoTaskMemは不要らしいです。CoTaskMemFreeが必要なLPWSTRはout IntPtrやout SafeHandleで受け取らなくても、out stringで受け取れば自動でMarshal.FreeCoTaskMemされるそうです。 ただし複数回…

C#9&Win API ドロップされたオブジェクトの表示名を取得する。

Windows APIを使用してごみ箱やPCのような特殊オブジェクトの表示名を取得するコードです。SHCreateShellItemArrayFromDataObject関数を使用しています。 #nullable enable using System; using System.Collections.Generic; using System.Runtime.InteropSe…

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

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

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関数はリ…