potisanのプログラミングメモ

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

Windows

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

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

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>…

C++20&Win32 API&WIL レジストリに登録されたCLSIDの情報をCSVへ書き出す

レジストリに登録されたCLSIDの情報(キー名、概要、InProcServer32のパス)をCSVへ書き出すコードです。コンセプト、std::wstring、バージョン情報の取得などを含んでいます。 main.cpp stl_util.hpp win32_reg_util.hpp win32_util.hpp FileVersionInfo.hp…

C++20&Win API ファイルにUTF-16文字列を出力する

ファイルにUTF-16文字列(std::wstring_viewが対応するデータ)を出力するにはstd::ofstreamをバイナリモードで使用します。次のようなコードを準備しておくと便利だと思います。 #include <fstream> #include <filesystem> // UTF-16文字列を指定されたパスへ出力します。BOMは付</filesystem></fstream>…

C++20&WIL&Win API MMDevice APIでスピーカー(既定のマルチメディア出力)の音量情報を取得する

Windows Vistaからはマスター音量(システム全体の音量)の変更にCOMベースのMMDevice API (Windows Multimedia Device API)を用います。ここではスピーカー(既定のマルチメディア出力)の音量情報を取得するコードを記載します。 #include <format> #define STRICT</format>…

C++20&WIL&Win API MMDevice APIでスピーカー(既定のマルチメディア出力)の表示名を取得する

Windows Vistaからはマスター音量(システム全体の音量)の変更にCOMベースのMMDevice API (Windows Multimedia Device API)が用いらます。ここではスピーカー(既定のマルチメディア出力)の表示名を取得するコードを記載します。 #define STRICT #define N…

C++20&WIL&Win API MMDevice APIでミュートを切り替える

Windows Vistaからはマスター音量(システム全体の音量)の変更にCOMベースのMMDevice API (Windows Multimedia Device API)が用いらます。ここではミュートを切り替えるコードを記載します。 #define STRICT #define NOMINMAX #include <Windows.h> #include <mmdeviceapi.h> #include <endpointvolume.h></endpointvolume.h></mmdeviceapi.h></windows.h>…

C++20&Win API デバイス情報要素の文字列プロパティ(概要、クラス、クラスGUID、フレンドリーネーム、ハードウェアID)を列挙・整理する

デバイス情報要素の文字列プロパティ(概要、クラス、クラスGUID、フレンドリーネーム、ハードウェアID)を列挙するコードです。再利用可能なコードをUtility.hppへ移動しています。 文字列プロパティ(概要、クラス、クラスGUID、フレンドリーネーム、ハー…

C++20&Win API Setup APIでシステムに存在するデバイスのクラス・インターフェイスのクラスと説明を列挙する

Setup APIでシステムに存在するデバイスのクラス・インターフェイスのクラスと説明を列挙するコードです。 単純に列挙する #pragma comment(lib, "SetupAPI.lib") #include <bit> #include <format> #include <string> #define STRICT #include <Windows.h> #include <SetupAPI.h> #include <InitGUID.h> #include <devpkey.h> //</devpkey.h></initguid.h></setupapi.h></windows.h></string></format></bit>…

C++20&Win API デバイス情報要素のGUID、不透明ハンドル、概要を列挙する

デバイス情報要素のGUID、不透明ハンドル(Opaque Handle)、概要を列挙するサンプルコードです。 #include <memory> #include <string> #include <format> #include <numeric> #include <iostream> #include <list> #pragma comment(lib, "SetupAPI.lib") #define STRICT #define NOMINMAX #include <Windows.h> #include <SetupAPI.h></setupapi.h></windows.h></list></iostream></numeric></format></string></memory>…

C++20&Win API ドロップされたOLEデータオブジェクトのクリップボード形式を列挙する

エクスプローラーやブラウザからドロップされたデータのデータ形式を列挙するサンプルコードです。Windowsプロジェクトでのウィンドウクラスの登録、ウィンドウの表示、複数行テキストボックスだけ持つウィンドウの実装、IUnknownクラスの実装サンプルとして…

C++20&Win API ドロップされたOLEデータオブジェクトに含まれるShellItemを列挙する

ドロップされたOLEデータオブジェクトに含まれるShellItem(ファイル、フォルダ、特殊フォルダ等)を列挙するサンプルコードです。 #define STRICT #include <Windows.h> #include <ShlObj.h> #include <ShObjIdl.h> #include <bit> #include <format> #include <string> #include <vector> auto MY_WINDOW_CLASS_NAME{ L"Pr</vector></string></format></bit></shobjidl.h></shlobj.h></windows.h>…

C++20&Win API IMAGE_COR20_HEADERを取得する

概要 32ビット形式のPEファイルを生データとして解析してIMAGE_COR20_HEADER構造体を取得するサンプルコードのC++20版です。実際にはIMAGE_COR20_HEADER構造体のメインであろうメタデータは今後の拡張に備えてフォーマット非公開なのでCLSID_CorMetaDataDisp…

C++20&Win API ファイルのセキュリティユーザーの名前を列挙する

ファイルセキュリティ記述子→DACL→ACEと取得してセキュリティユーザーの名前を列挙するサンプルです。 #include <bit> #include <string> #include <span> #include <memory> #include <vector> #define STRICT #define NOMINMAX #include <Windows.h> #include <AclAPI.h> // ファイルのセキュリティ情報をバイト配列</aclapi.h></windows.h></vector></memory></span></string></bit>…

C++20&Win API ファイルセキュリティオーナーの名前・参照ドメイン名・名前の使い方を取得する

一部のC APIにC++ラッパーを作成しています。 #include <string> #include <vector> #define STRICT #define NOMINMAX #include <Windows.h> // ファイルのセキュリティ情報をバイト配列として返します。 std::vector<BYTE> GetFileSecurityW(std::wstring_view Path, SECURITY_INFORMATION Re</byte></windows.h></vector></string>…

C++20&Win API GetTokenInformation関数のサンプルコード

共用のコード #pragma once #include <string> #include <format> #include <vector> std::vector<BYTE> GetTokenInformationInByteArray( HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass) { DWORD required; if (!::GetTokenInformation(TokenHandle, TOKEN_INFORMAT</byte></vector></format></string>…

C++20&Win API&WIL 特権のプライマリドメイン情報(名前・SID)を取得する

#include <string> #include <iostream> #define STRICT #define NOMINMAX #include <Windows.h> #include <subauth.h> #include <ntlsa.h> #include <sddl.h> #include <wil/resource.h> #define THROW_IF_LSA_NTSTATUS_FAILED(status) THROW_IF_NTSTATUS_FAILED(::LsaNtStatusToWinError((status))) // LSA_UNICODE_STRIN…</wil/resource.h></sddl.h></ntlsa.h></subauth.h></windows.h></iostream></string>

PowerShell 7でMicrosoft フォトをアンインストールする

Import-Moduleに-UseWindowsPowerShellを指定します。検索して最初の方にヒットするコードは古いPowerShellを使用しているのでPowerShell 7環境では使い物になりません。 Import-Module Appx -UseWindowsPowerShell Get-AppxPackage *Microsoft.Windows.Phot…

C++20&Win API IPv4アドレスを列挙する

WindowsでIPv4アドレスを列挙するサンプルコードです。 GetIpAddrTable関数はメモリに構造体とそこから参照される文字列をまとめて配置します。このコードではそれらをまとめて管理するためにクラスを使用しています。なお、この関数はループバックアドレス…

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++20&Win API(Vista~) 各電源スキームのサブグループのGUID・名前・概要を列挙する

#include <format> #include <iostream> #include <string> #include <vector> #include <optional> #define STRICT #include <Windows.h> #include <powrprof.h> #pragma comment(lib, "powrprof.lib") namespace PowerUtil { std::vector<GUID> GetPowerSchemeGUIDs() { std::vector<GUID> guids; for (ULONG i = 0; ; ++…</guid></guid></powrprof.h></windows.h></optional></vector></string></iostream></format>

C++20&Win API(Vista~) 電源スキームのGUID・名前・概要を列挙する

#include <iostream> #include <string> #include <vector> #include <optional> #define STRICT #include <Windows.h> #include <powrprof.h> #pragma comment(lib, "powrprof.lib") namespace PowerUtil { std::vector<GUID> GetPowerSchemeGUIDs() { std::vector<GUID> guids; for (ULONG i = 0; ; ++i) { GUID guid; DW…</guid></guid></powrprof.h></windows.h></optional></vector></string></iostream>

C++20&Win API(Vista~) 画面の明るさを取得・設定する

Windows Vista以降で画面の明るさを取得・設定するサンプルコードです。 画面の明るさの範囲と設定値を取得する。 画面の明るさを設定する。 現在の画面プロファイルの概要・名前を取得する。 画面の明るさの範囲と設定値を取得する。 #include <iostream> #include <string> #</string></iostream>…

C++20&Win API プライマリモニターのハンドル取得&物理モニター情報の列挙

プライマリモニターのハンドルを取得して、その物理モニター情報を列挙するサンプルコードです。 #include <format> #include <iostream> #include <string_view> #include <span> #include <vector> #define STRICT #include <Windows.h> #include <physicalmonitorenumerationapi.h> #pragma comment(lib, "dxva2.lib") inline HMONITOR GetPrimaryMon</physicalmonitorenumerationapi.h></windows.h></vector></span></string_view></iostream></format>…

C++20&Win API ACPIテーブルIDを整数・文字列として列挙する

ACPIテーブルIDを整数・文字列として列挙する。 #include <format> #include <iostream> #include <vector> #define STRICT #define NOMINMAX #include <Windows.h> namespace SysInfoUtil { std::vector<DWORD> EnumSystemACPITableIDs() noexcept { auto buffer_size = ::EnumSystemFirmwareTables('ACP</dword></windows.h></vector></iostream></format>…

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;…