こんにちは。kame404です。
先日、サブモニターの縦横を変えようと、手癖で Ctrl + Alt + ← を入力したところ、何も反応しないことに気が付きました。
以前のWindows環境では、このショートカットキー一発で画面が回転していたはずなのですが、何度試しても動きません。
調べてみたところ、この「Ctrl + Alt + 矢印キーで画面回転」という機能はWindows OS標準の機能ではなく、Intel Graphics ドライバの機能であったことが分かりました1。どうやら近年のドライバや環境によっては、この機能がデフォルトで無効化されていたり、そもそも機能自体が削除されていたりするようです。
そこで、OSやドライバの仕様に依存せず、かつ極限まで軽量に動作する画面回転ユーティリティ「Screen Rotator」をC言語とWin32 APIを用いて作成しました。
開発にはClaude 4.5 Opusを活用しました。
成果物のバイナリ(19KB)とソースコードはGitHubで公開しています。
なぜ今、C言語とWin32 APIなのか
もちろん、画面を回転させる常駐ソフト自体は世の中にいくつか存在します。しかし、キーボード入力を常に監視する常駐アプリを、出所が不明瞭なまま使い続けることには少し抵抗がありました。
また、たかが「画面を回す」だけの機能に、数十MBものメモリを消費したり、重いランタイムをインストールしたりするのは美しくありません。
どうせ作るなら、WindowsのAPIを直接叩く軽量なツールにしたい。ということで、今回はC言語とWin32 APIを選定しました。
概要
今回作成した「Screen Rotator」の特徴
-
Ctrl + Alt + 矢印で即座に画面を回転。 - 「現在マウスカーソルがあるモニター」が回転対象。
- 引数なしで起動すればタスクトレイ常駐、引数ありならCLIツールとして動作。
設計と実装
このアプリは一つのexeファイルで、GUI(常駐)とCUI(コマンドライン)の両方の役割をこなします。WinMain 関数内で引数をチェックし、振る舞いを動的に切り替えています。
回転処理
画面回転の実装でハマりやすいのが、縦横の入れ替え処理です。
単に「向き(Orientation)」を変更するだけでは、ドライバが設定を受け付けてくれない場合があります。横向き(Landscape)から縦向き(Portrait)へ変更する場合、解像度の幅(Width)と高さ(Height)もプログラム側で明示的に入れ替えてリクエストする必要があります。
高DPI対応
マルチモニター環境、特にスケーリング設定(100%, 150%など)が異なるモニターが混在している場合、マウス座標の判定がずれることがあります。
これを防ぐため、SetProcessDpiAwarenessContext APIを使用し、アプリケーションを Per-Monitor DPI Aware V2 として動作させています。
ビルドコマンド
MinGW (GCC) を使用し、以下のコマンドでコンパイルしています。
gcc -o ScreenRotator.exe ScreenRotator.c -mwindows -static -Os -s
-
-mwindows: コンソールウィンドウを出さないGUIアプリとしてビルド。 -
-static: 必要なライブラリを静的リンクし、DLL依存をなくす。 -
-Os: サイズ優先の最適化。 -
-s: デバッグ情報の削除(ストリップ)。
実行ファイルのサイズ
このビルド設定により、生成された ScreenRotator.exe のサイズは約 19KB となりました。
メモリ使用量
常駐アプリで最も気になるのがメモリ使用量ですが、タスクマネージャーで見たところ、約 0.1MB 程度で推移してます
おわりに
開発にあたっては Claude 4.5 Opusを使いましたが、Win32 API特有の冗長な記述(構造体のゼロクリアや長い定数名など)をAIが補完してくれるため、人間は仕様の決定に集中することができました。C言語のようなローレベルな記述こそ、AI支援の恩恵を大きく受けられる領域かもしれません。
ソースコード全文はGitHubに置いてありますので、興味のある方は覗いてみてください。

