ぺんちゃん日記

食と歴史と IT と。 Web の旅人ぺんじろうが好奇心赴くままに彷徨います 。

スクリーンキーボードとエクスプローラーのウィンドウの位置と サイズアジャスト【AutoHotkey】。

f:id:yasushiito:20190403184928p:plain

これまでのサイズアジャスター。

Auto HOT Key スクリプトで アプリケーションの初期サイズとウインドウ位置を調整しています。
アプリケーションによっては起動時のポジションを保存してくれずに毎回違う位置に開いてくれるものもあります。
自分で作ったやつですけどね。

PC の起動時だけでなく、ウインドウを操作ミスで動かしてしまった時に元通りにするためにも使っています。
自分にとっては必要な機能ですが、スクリーンキーボードとエクスプローラーに限っては Auto HOT Key で操作しようとしても期待通りに動いてくれなかったので、その点には不満がありました。
そこで今回は何とかしてスクリーンキーボードとエクスプローラーを移動させたりサイズ変更したりしてみたいと思います。

スクリーンキーボードを移動させる。

Windows のアカウント切り替えをするとスクリーンキーボードの位置が変更されることがあるような気がします。
ちょっと法則がつかめなんで原因がわからないのですが、何かの拍子にスクリーンキーボードがすごく遠い位置に言ってしまうことがあるんです。
ドラッグ処理が苦手なので(特に下方向) 元の位置に移動させるのがとても面倒。
頻繁ではないにしろ、可能であればボタン一発で元の位置に戻したいです。

スクリーンキーボードは AutoHotkey スクリプトを管理者権限で実行することで移動させることができます。
管理者権限を持たないで実行した時は無視されます。

実はここまでは実現できていて、以前に日記でもまとめています。

yasushiito.hatenablog.com


この時は管理者権限で実行させると確認ダイアログが表示されることを嫌って採用しなかったのですね。
時々ということなら必要な時だけ管理者権限で実行させれば良いだけと割り切ればいいことに気がつきました。
権限がなければ無視されるので、 日常の利用に差し支えはないということです。

    ;スクリーンキーボードの位置とサイズの調整 ただし管理者権限で実行した時のみ作用する。
    Process,Exist,osk.exe
    osk := %ErrorLevel%
    if osk <> 0
    {
        WinMove,ahk_exe osk.exe, ,120,747,646,196
    }

myahk/adjust.ahk at master · yasushiito/myahk


これで解決。

エクスプローラーを移動させる。

エクスプローラーはウィンドウタイトルに特定の文字を含まないシンプルなスタイルなので、ウィンドウタイトルを使った判別法は使えません。
そこでスクリーンキーボードを移動させたときと同じように、実行ファイル名からプロセス ID を取得して操作することにします。
エクスプローラも同じように管理者権限を必要とするのではないかと、先ほどのスクリーンキーボードを移動させたコードをコピペして、スクリプト管理者権限付きで実行してみました。
ところがこいつは動いてくれませんでした。

エクスプローラーのプロセスの ID をメッセージボックスの表示確認で確認したところ、変数が空っぽで取得できていませんでした。

どうもこれはエクスプローラー固有の現象で、ユーザがファイラーとして操作しているエクスプローラのウィンドウのハンドルをプロセスから取得できないようですね。
エクスプローラーってずっと常駐して動いてますもんね。

AutoHotkey でのエクスプローラーの操作を Google で検索してみたところ、実現している例がいくつも見つかったので自分がヘボいだけで可能ということですね。
例えば次の例では実行ファイル名ではなくクラス名でエクスプローラーを探しています。

poimono.exblog.jp


そこで他の利用例と同じように実行ファイル名ではなくクラス名でウィンドウハンドルを掴む方法で実装します。
クラス名だと別のアプリケーションを掴んでしまいそうで怖いのですが。

    ;エクスプローラの位置とサイズの調整。
    ;ただし OS が管理しているエクスプローラーのハンドルを掴んでしまうので Window クラスでウィンドウをつかんでいる。
    ;同じクラスを使ったアプリケーションがあると失敗するかも。
    Process,Exist,explorer.exe
    explorer := %ErrorLevel%
    if explorer <> 0
    {
        WinMove,ahk_class CabinetWClass, ,460,10,1068,710
    }

myahk/adjust.ahk at master · yasushiito/myahk


このコードならエクスプローラーを移動させてくれました。
もちろん管理者権限必要ありません。
ただしエクスプローラが複数起動している場合は 保証されません。
私の運用では特に問題はありません。
ということで解決。


この記事に登場するAutohotkey スクリプトについて

この記事の中で私が作成したプログラムは、全て自由に使うことができます。
詳しくはこちら