イネマルのプログラミング備忘録

趣味プログラマのメモ

【WinAPI】C++ Windows11 環境でウィンドウの角丸を制御する

ウィンドウの角丸を制御する Windows11 から、デフォルトでウィンドウの四つ角が丸められます。 これを、Windows10 のような丸められていない状態などに変更するには、DwmSetWindowAttribute を使用します。 ※ Windows11 以降で利用可能 な方法です。それ以…

【WinAPI】C++ ウィンドウの背景色を取得する方法

メモ ウィンドウクラスの登録時に指定する、背景色ブラシからRGBカラーを取り出す。 実装 auto hb = reinterpret_cast<HBRUSH>(::GetClassLong(m_hWnd, GCL_HBRBACKGROUND)); LOGBRUSH br{}; if (::GetObject(hb, sizeof(br), &br)) { BYTE r = GetRValue(br.lbColor</hbrush>…

【WinAPI】C++ タスクバーのアイコンを強調表示する(FlashWindowEx)

メモ ウィンドウを最小化している時など、ウィンドウを表示していない時に、 ユーザーに処理の完了を通知するにはタスクバーアイコンを強調表示します。 これは、FlashWindowEx を使用して実現します。(Windows10 では、オレンジ色に光ります。) 実装 // …

【WinAPI】C++ ウィンドウの最小サイズと最大サイズを取得する(WM_GETMINMAXINFO)

メモ ウィンドウメッセージ「WM_GETMINMAXINFO」を、目的のウィンドウに送信して取得する。 ウィンドウのサイズ制御は、アプリ毎に実装が異なるので、 ウィンドウ側がメッセージを処理していない場合には、取得できないことに注意する。 実装 int APIENTRY w…

【Windows】Aeroシェイク のみ無効化する(Aeroスナップ は有効)

メモ Aeroスナップは多用するけど、Aeroシェイクを誤爆しがちなので、 シェイクの方だけ無効化したい。 これは、レジストリの設定で対応可能。 レジストリの設定 .reg ファイル(UTF-16 with BOM)を作って実行するだけ。 Windows Registry Editor Version 5…

Windows10 で、初代 MOTU UltraLite を使う(ドライバーのインストール)

はじめに ドライバーを見つけられなくて、インストールに躓いたので簡単にメモを残しておく。 公式トップに出てくるページから、UltraLite (含む古い製品)を選択すると Firmware 項目しか出てこないけど、 サポートページの方に、置いてあるよという話。 …

ImageMagick で、画像を 4bit深度 bmp に変換する(減色)

メモ Windows API のLoadBitmap等、 何かしらのリソースとして4bit深度のビットマップイメージが使いたい時、 「ImageMagick」と「ペイント(mspaint)」を使って作成する例。 ImageMagick の入手 ImageMagick - Download 今回は、Portable版を使う。(Image…

Windows カスタムURLスキームの設定方法(URLからアプリを起動する)

メモ ブラウザからローカルのアプリケーションを起動するには、カスタムURLスキームを利用する。 Windows では、レジストリの設定により実現できる。 レジストリの設定 任意のアプリ(MyApp.exe)を登録する例 下記の設定で、myapp: が認識されるようになる…

レビュー: Razer Ornata を普段使いした雑感

メモ Razer Ornata を普段使いした感想。 Razer Ornata - Japanese | razer.com | Razer 日本 経緯 安物キーボードを2年以上使っているので、気分転換したくなった パンタグラフからの移行なので、薄型のキーボードを探していた Razer Ornata は、型落ちで…

WSH JScript Chakra エンジンの共存による機能制限の回避(WScript Quit 代替)

はじめに WSH JScript に Chakra を指定すると WScript Object の機能が制限される為、 WScript.Quit 関数が利用できず、戻り値を返す術が失われます。 今回は、この問題の対処例を挙げます。 前提 Windows 環境には、Windows Script Host(WSH)と呼ばれる …

JScript Chakra wscriptで、ECMAScript 2015 (ES6) を利用する

はじめに wscript を利用する際に、Chakra エンジンを指定する方法です。 cscript で JScript を利用する場合、Chakra エンジンを指定するために バッチファイルと組み合わせる方法がありますが、 wscript ではコマンドプロンプトの画面が不要なので、非表示…

V言語 vlang コンソールで入力待ちする

メモ ・OS 非依存 標準入力で待機する。 import os fn main() { // 入力待ち os.get_line() } ・Windows 環境 pause コマンドで待機する。 import os fn main() { // 入力待ち os.system('pause') }

WSH WSF JScript・VBScript で、YAML をパースする方法(js-yaml)

JScript や VBScript で yaml ファイルをパースしたいとき、 wsf形式と外部パッケージのjs-yamlで、簡単に実現できます。 github.com 実装 yamlファイル。(sample.yaml) 文字コードは、SJISを使用。 # 設定ファイル config: title: "AppName" width: 1280 …

WSH JScript で、高精度に処理時間を計測する(Performance API)

はじめに JScriptで、スクリプトの処理時間を計測するとき、 Date オブジェクトを使って計測することがありますが、これはミリ秒単位の精度です。 厳密な速度計測が不要であれば、ミリ秒もあれば事足りますが、 より精度の高いマイクロ秒単位が必要であれば…

WSH JScript で、JSONファイルをパースする(Chakra を利用する場合)

メモ 既定のJScript でJSONオブジェクトを利用する方法の別解。 Chakra エンジンを使うとJSONオブジェクトが定義済みで、そのまま使える模様。 実装 エンジンを指定するため、適当な .bat に埋め込んで使います。 0</*! :: @%windir%\System32\cscript.exe //nologo //E:{1B7CD997-E5FF-4932-A7A6-2A9E636DA385} "%~f0" %*||pause @pause rem 入力待機 @exit /b */0; (()=>{ try { // JSONをパース const jsonTxt = …

WSH JScript CScript プログレスバー

はじめに 軽く検索しても手軽なサンプルが見つからなかったので、 CScript と JScript を使ったコマンドライン環境向けに、プログレスバーを用意します。 ↓ のように動きます。 実装 最低限の機能があれば良いので、設定できるオプションは下記だけ。 MaxVal…

WSH wsf の resource を外部ファイルに切り出す(WSC を使った実装の分割)

はじめに WSH(.wsf) では、<resource>タグを使って任意のテキストデータをスクリプトに埋め込みできます。 しかし、設定ファイル用途で使用したり、ある程度容量が増えてきたりすると、外部ファイルに分割したくなります。 こういった場合ファイルの分割は、Windows Sc</resource>…

C++ CLI Processクラスから HINSTANCE を取得する

メモ C++/CLI 環境で、Process クラスで起動したプログラムのインスタンスハンドルを取得する方法。 Handleプロパティが、そのまま HINSTANCE として扱える。 実装 // 「ペイント」を起動 auto proc = gcnew System::Diagnostics::Process(); proc->StartInf…

JScript.NET をバッチに埋め込む方法

はじめに Microsoft製のドマイナー言語、JScript .NET をバッチファイルに埋め込んで実行する方法です。 JScript .NET は、スクリプト言語である WSH版 JScript の後継的な位置づけでありながら、コンパイル必須という扱いづらい言語なので、 コンパイル処理…

DXライブラリ向け 簡易キー入力クラス

はじめに DXライブラリで、キー入力の開始や終了を取る際、自前で機能を用意する必要があります。 必要になるたびに作るのが面倒そうなので、キー入力クラステンプレート的なものを置いときます。 対象は、キーボードとマウスです。 昔、DxLibをラップした自…

WSH WSF JScript・VBScript をバッチに埋め込む方法(現在時刻を読み上げるバッチファイル)

メモ タイトルの通り、wsf 形式のWSHスクリプトをバッチファイルに埋め込む方法です。 wsfを使えば、VBScript と JScript を混在させたり、 HTML の scriptタグ と同じように記述できるのでCDNを利用できます。 バッチに埋め込むメリットは、用途次第という…

WSH JScript Chakra を使用した ES2015(ES6) 対応 ( スクリプトエンジン まとめ )

はじめに WSH JScript (wscript cscript) で使用できる スクリプトエンジン まとめです。 JavaScript限定、プリインストールされている物だけなので注意。 ツールとして独立しているChakraCoreや、その他サードパーティーは含みません。 各 JavaScript エン…

WSH JScript JSONファイルを使用する

はじめに WSH JScript で、設定ファイルに対応する際に使用した方法です。 WSH(VBScript, JScript) から設定ファイルを扱う場合、JSON を使用すると楽できます。 注意 文字コードは、SJIS を使用しています。 それ以外の文字コードでは、動作検証していませ…

C++ Windowsで ini ファイルを読み込む

はじめに Windows で、ini ファイルの読み込みと言えば、GetPrivateProfileStringです。 時間をかけずに、手っ取り早く設定ファイル対応を行うときに使えるかもしれない方法です。 注意 GetPrivateProfileString は、下記に引用した通り 16ビット互換 のため…

C++ ビルド時の西暦を表示

メモ 定義済みマクロ の、__DATE__ は文字列として扱えるので、 西暦部分の先頭アドレスがあれば事足りる。 実装 #include <iostream> // cout constexpr const char* YEAR = (__DATE__ + 7); int main() { std::cout << "ビルド年:" << YEAR << std::endl; return 0;</iostream>…

C++ バージョン番号を比較する方法

C++

はじめに 複数の値から形成されているバージョン番号などの値を比較する際、 一つずつ比較するのは、手間ですが、std::lexicographical_compare を使用すると、一行で書けます。 なお、std::tuple でより短くスマートに実装できるので、追記要参照。 実装 #i…

Windows C++ 実行ファイルからバージョン情報を取得する

メモ バージョンリソースが含まれるファイルからバージョン情報を取得する方法。 Windows API の GetFileVersionInfo を使って取得する。 実装 #include <windows.h> #include <iostream> #include <vector> #include <string> #pragma comment(lib, "version.lib") // バージョン取得用の構造体 s</string></vector></iostream></windows.h>…

C++ 環境変数を含むパスをstd::stringに展開する方法

はじめに パスに限らず、環境変数を含む文字列は、 WindowsAPIの ExpandEnvironmentStrings で展開できます。 std::string に展開する方法をメモ。 実装 #include <windows.h> #include <iostream> #include <string> // 環境変数を含むパスを展開する bool GetExpandEnvironmentPath(cons</string></iostream></windows.h>…

C++ で、コマンドの標準出力を取得する方法(CreateProcessなし)

はじめに Windows でコマンドを実行する際、標準出力を取得する方法です。 コンソール画面が表示されても問題ない場合、 もしくは、CUIプログラムで使用できる方法です。 前提 system 関数だけでは、標準出力が簡単に取得できません。 Windows 環境では、API…

C++ コマンドライン引数をstd::vector<std::string>に展開する方法

ちょっとしたメモ コマンドライン引数をstd::vector<std::string>に展開する方法です。 パース自体は、コンストラクタのみで実現できます。 実装 #include <iostream> #include <vector> #include <string> int main(int argc, char** argv) { using namespace std; vector<string> args(argv, argv + argc);</string></string></vector></iostream></std::string>…