potisanのプログラミングメモ

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

Windows

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)ですが、名前空間など…

Windows11 ファイルの新規作成登録の注意点

メモ帳をアンインストールしたらファイルの新規作成からテキストファイルが消えました。修復過程で気付いた注意点を共有します。 「新規作成」項目の実体は拡張子単位のレジストリキーShellNew。HKCR直下の拡張子キーまたは拡張子キー直下のファイル型キーに…

C++&Win API _bstr_tとwil::make_bstr

Windows環境でLPWSTRからスマートポインタ的なBSTRを作成する方法には次の2通りあります。 _bstr_t(...) <comutil.h> wil::make_bstr(...) "wil/com.h" 前者の_bstr_t(...)はコンパイラ付属なので追加インストールが不要ですが、ムーブセマンティクス非対応で独自の参照</comutil.h>…

PowerShell7 URL Protocol値の設定されたProgIDを列挙する

URL Protocol値の設定されたProgIDを列挙するコードです。Get-ItemPropertyコマンドレットは-Nameに配列を与えれば複数の値の有無でキー名を取得できることが分かります。 # 呼び出し側のスコープにHKCRを登録します。 function Register-HKCR { [OutputType…

C++20&Win API ビデオキャプチャデバイスの情報を取得する

DirectShowを使ってビデオキャプチャデバイスの情報を取得するコードです。ネット上で様々な方がコードを公開しているコードをWIL対応にしたようなコードです。一部の情報はMicrosoft Docsの「キャプチャ デバイスの選択」を参考にしています。 #include <string> #d</string>…

PowerShell7 登録された拡張子のProgIDとProgIDの概要を取得する

PowerShell 7で登録された拡張子のProgIDとProgIDの概要を取得するサンプルコードです。-Pathと-LiteralPathの挙動の違い、Get-ItemPropertyによる高速化(Get-ChildItem比)等を確認するためのコードです。 # 呼び出し側のスコープにHKCRを登録します。 fun…

C++20&Win API 無線ネットワークのシグナル品質を列挙する

ネイティブWiFi APIを使って無線ネットワークのシグナル強度を列挙するコードです。いくつかのネイティブWiFi APIは独自メモリに確保した構造体に可変長配列を持ちますが、std::unique_ptrとstd::spanを使えば可読性と安全性をまとめて担保できます。 シグナ…

C++20&Win API ファイルセキュリティのグループ名またはユーザー名をまとめて取得する

ファイルのセキュリティ記述子に含まれるグループ名またはユーザー名をまとめて取得するコードです。実際には個々のACEから名前を取得して、それをstd::setでまとめています。 #include <array> #include <string> #include <set> #include <vector> #define STRICT #define NOMINMAX #in</vector></set></string></array>…

C++20&Win API ファイルセキュリティのグループ名またはユーザー名をACE毎に取得する

ファイルのプロパティ、セキュリティタブのグループ名またはユーザー名に表示される名前をACE毎に取得するコードです。セキュリティ記述子とDACLの学習用でもあります。 コード メモ コード #include <array> #include <string> #include <vector> #define STRICT #define NOMINMAX </vector></string></array>…

C++23Preview&Win API ローカルコンピューターのデバイス列挙子とデバイスIDリストの取得

CM系のAPIを使用してローカルコンピューターのデバイス列挙子とデバイスIDリストを取得するコードです。C++23で導入予定のstd::ranges::toを使用しています(MSVCのPreview版)。 #include <ranges> #include <algorithm> #include <iostream> #include <string> #include <vector> #define STRICT #define</vector></string></iostream></algorithm></ranges>…

Python3 PEファイルの情報を取得するクラス

標準ライブラリのみ使用してPEファイルの情報を取得するクラスのコードです。現状ではインポート、エクスポート情報のみ対応しています。おそらくインポート情報を持たないファイルだとエラーが発生します。 #test.py from pefileinfo import * with PEFileI…

C++20&Win API SHGetNameFromIDList関数で項目の表示名を取得する

シェル項目の表示名を取得するにはSHGetNameFromIDList関数を使えます。C++環境ではIShellItemインターフェイスを使いますが、Pythonなどでインターフェイスを介したくない場合に便利です。 #include <format> #include <iostream> #define STRICT #define NOMINMAX #include <Windows.h> </windows.h></iostream></format>…

C++20&Win API&WIL HTTPSプロトコルのコンテンツを取得する

WinINet APIを使用してHTTPSプロトコルのコンテンツ(https://~)を取得するコードです。 #include <string> #include <span> #include <optional> #include <vector> #define STRICT #define NOMINMAX #include <Windows.h> #pragma comment(lib, "wininet.lib") #include <wininet.h> #include "wil/resource.h" </wininet.h></windows.h></vector></optional></span></string>…

C++20&Win API&WIL IUIAutomationElementを列挙する

COMとWILを使ってIUIAutomationElementを列挙するコードです。 実行例(ExplorerPatcher起動中) Source.cpp #include <format> #include <iostream> #include "string_util.hpp" #define STRICT #define NOMINMAX #include <Windows.h> #include <UIAutomation.h> #include "stl_win.hpp" #include "wil/c</uiautomation.h></windows.h></iostream></format>…

C++20 円柱モデルHSV色クラスとHSV四角形の描画

円柱モデルのHSV色を扱うクラスとそれを利用したHSV四角形(V固定)の描画サンプルです。RGBとHSVの変換はWikipediaのコードを使用しています。 HSVをH:[0, 360)、SとV:[0, 1]で扱うとRGBも[0, 1]で扱う方が簡単です。そのため、[0, 1]のRGBと[0, 255]のRG…

C++20&Win API&WIL AMSIプロバイダーのCLSIDと表示名を取得する。

WindowsのAMSI(マルウェア対策スキャンインターフェイス)プロバイダーのCLSIDと表示名を取得するコードです。AMSIについてはMicrosoftの公式ドキュメントを参照ください。 #include <string> #include <vector> #define STRICT #define NOMINMAX #define WIN32_LEAN_AND_ME</vector></string>…

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++20&WinAPI &WIL Shell.Applicationでエクスプローラーウィンドウの情報を取得する

Shell.Application(CLSID_Shell)でエクスプローラーウィンドウの情報を取得するサンプルコードです。 VBやC#経由で使う場合はIDispatchを使って名前からメンバーを参照することが多いですが、ここではインターフェイス(IShellWindows、IWebBrowser2)を取…

C++20&Win API&WIL バッテリーデバイスの名前を列挙する

C++20・Win API・WILでバッテリーデバイスの名前を列挙するサンプルコードです。 #include <functional> #include <string> #include <vector> #define STRICT #define NOMINMAX #include <Windows.h> #include <SetupAPI.h> #pragma comment(lib, "SetupAPI.lib") #include <devguid.h> #include <initguid.h> #include <devpkey.h> #include "wil/</devpkey.h></initguid.h></devguid.h></setupapi.h></windows.h></vector></string></functional>…

C++20&Win API&WIL Process Snapshot APIでプロセスのハンドル型・オブジェクト名を列挙する

Process Snapshot APIを使ってプロセスに所属するハンドルの型やオブジェクト名を列挙するサンプルコードです。 #include <algorithm> #include <filesystem> #include <string> #include <memory> #include <vector> #define STRICT #define NOMINMAX #include <Windows.h> #include <Psapi.h> #include "wil/resource.h" templa</psapi.h></windows.h></vector></memory></string></filesystem></algorithm>…

C++20&Win API プロセスのIDとパスを列挙する

Win32 APIのEnumProcesses関数、QueryFullProcessImageNameW関数を使ってプロセスのIDとパスを列挙するサンプルコードです。 #include <string> #include <memory> #include <vector> #define STRICT #define NOMINMAX #include <Windows.h> #include <Psapi.h> template <DWORD InitSize = 100, DWORD ExpandingSize = 100> std::vector<DWORD> GetAllProces…</dword></dword></psapi.h></windows.h></vector></memory></string>

C++20&WinAPI&WIL ZIPファイルに関連付けられたCLSIDを取得する

ZIPファイルに関連付けられたCLSIDとそのProgIDを取得するコードです。 #include <array> #include <bit> #include <format> #include <string> #include <optional> #define STRICT #include <windows.h> #include "wil/resource.h" std::optional<GUID> GetSystemFileAssociationCLSID(PCWSTR name) noexcept { con</guid></windows.h></optional></string></format></bit></array>…

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

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

C++20&Win API&WIL IShellItemで既知フォルダのフォルダIDと名前を列挙する

IShellItemインターフェイスで既知フォルダ(Known Folder)のフォルダID(識別子)と名前を列挙するコードです。実行するとデバッグウィンドウに既知フォルダの数だけ「フォルダID: 名前」を出力します。 #include <format> #include <ranges> #include <vector> #define STRICT #de</vector></ranges></format>…

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

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

C++20&Win API WICコンポーネントの情報を取得する

Windowsイメージングコンポーネント(WIC、Windows Imaging Component)(Microsoft Docs)のWICコンポーネントの情報を取得するサンプルコードです。基本的な流れは「IWICImagingFactoryの作成→CreateComponentEnumeratorでIEnumUnknownを作成→IEnumUnknown…

C++20&Win API Win APIで文字列をA/W変換する

Win APIのMultiByteToWideChar関数、WideCharToMultiByte関数でstringとwstringを相互変換するコードです。テストはしていません。 C++20からは標準ライブラリのコンバーターが非推奨なので自作するか外部ライブラリを使用する必要があります。 #include <bit> #i</bit>…

C++20&Win API&WIL コンポーネントカテゴリマネージャーを使う

CLSID_StdComponentCategoriesMgrとICatInformationインターフェイスを使ってコンポーネントカテゴリの情報を取得するコードです。カテゴリの概要や所属するクラスを列挙できます。 カテゴリの概要を列挙する #include <string> #define STRICT #define NOMINMAX #in</string>…