LightWeight HotKeyはWindowsの全域で使用できるショートカットキーアプリです。

AutoHotKey より単純な機能のみ提供しますが、GUIを通じて簡単に設定出来ます。

アプリ制作の動機

AutoHotKeyを使って色々なショートカットキーを使いましたが、新しいショートカットキーの登録時や機能変更時にその都度スクリプトのコード変更が不便の為、制作することになりました。

スクリプト作成してAhk2Exeでバイナリー化した後、アンチウイルスのアプリによるミスで探知される事がありました。

提供機能

  • ウィンドウの活性化
    • ウィンドウの検索条件:WindowTitle、ClassName、ProcessName
    • 検索条件: 文字列とRegular Expression
      • ウィンドウの検索のアプリはWinSpyをお勧めします。
  • アプリの起動(整合性レベルを選択可能:相續、低、中、高)
  • ウィンドウのサイズの変更や移動
  • マウスの移動(ターゲットのウィンドウの基準設定可能)
  • キーワードとマウスの入力
  • 画像ファイルとスクリーンとのマッピングを通じてマウスの移動
    • 画像のマッチングにパスする条件
      • (スクリーンと画像ファイルの) DPIが同一である
      • (スクリーンと画像ファイルの) 類似度が9割を超える
    • OpenCVの初回ロード時に遅延が発生する可能性がある
  • テキスト入力(ウィンドウズのクリップボード機能を使用するので長文章可能)
  • チェインルールサポート(連続でルールの実行可能)
  • DPIルールサポート(画面のディスプレイの表示倍率による条件)
  • 他プロセスのCListCtrl(SysListView32)のリストアイテムのコーピ
    • 260文字を超えないテキストのみサポート
    • Owner Dataモードはサポートされていない
  • ウィンドウズのトレイアイコンのクリック、ダブルクリック、マウスの移動サポート
    • 表示中のトレイアイコンのみクリック可能
    • 「トレイアイコン」の「クリック」や「ダブルクリック」機能で操作出来ない場合は「エミュレートクリック」機能で操作が可能

AutoHotKeyとの長所と短所の比較

  LightWeight HotKey AutoHotKey
設定難易度 普通 複雑(スクリプトの作成)
多様な機能支援 X(一部のショートカットキー機能のみ) O
GUI O X
Regular Expression O O
起動対象のIntegrity Levelの指定 O X
アンチウイルスによる探知 X(安全) O
ウィンドウズの起動時自動スタート O X
駆動方式 Hook Hook
DLL Injection X X

サポート演算子

名前 説明
RCT_Always常に実行
RCT_ActiveWindow_FullScreen現在のウィンドウがFullScreen
RCT_ActiveWindow_TitleMatch(対象ウィンドウの)タイトル一致
RCT_ActiveWindow_TitleBegin(対象ウィンドウの)タイトル開始
RCT_ActiveWindow_TitleEnd(対象ウィンドウの)タイトル終了
RCT_ActiveWindow_TitleContains(対象ウィンドウの)タイトルを含む
RCT_ActiveWindow_TitleRegexMatch(対象ウィンドウの)タイトル正規表現
RCT_ActiveWindow_ClassNameMatch(対象ウィンドウの)クラス名一致
RCT_ActiveWindow_ClassNameBegin(対象ウィンドウの)クラス名開始
RCT_ActiveWindow_ClassNameEnd(対象ウィンドウの)クラス名終了
RCT_ActiveWindow_ClassNameContains(対象ウィンドウの)クラス名を含む
RCT_ActiveWindow_ClassNameRegexMatch(対象ウィンドウの)クラス名正規表現
RCT_ActiveWindow_ProcessNameMatch(対象ウィンドウの)プロセス名一致
RCT_ActiveWindow_ProcessNameBegin(対象ウィンドウの)プロセス名開始
RCT_ActiveWindow_ProcessNameEnd(対象ウィンドウの)プロセス名終了
RCT_ActiveWindow_ProcessNameContains(対象ウィンドウの)プロセス名を含む
RCT_ActiveWindow_ProcessNameRegexMatch(対象ウィンドウの)プロセス名正規表現
RCT_ActiveWindow_ProcessPathMatch(対象ウィンドウの)プロセスパス一致
RCT_MouseCursorChildWindow_TitleMatch(対象ウィンドウの)タイトル一致
RCT_MouseCursorChildWindow_TitleBegin(対象ウィンドウの)タイトル開始
RCT_MouseCursorChildWindow_TitleEnd(対象ウィンドウの)タイトル終了
RCT_MouseCursorChildWindow_TitleContains(対象ウィンドウの)タイトルを含む
RCT_MouseCursorChildWindow_TitleRegexMatch(対象ウィンドウの)タイトル正規表現
RCT_MouseCursorChildWindow_ClassNameMatch(対象ウィンドウの)クラス名一致
RCT_MouseCursorChildWindow_ClassNameBegin(対象ウィンドウの)クラス名開始
RCT_MouseCursorChildWindow_ClassNameEnd(対象ウィンドウの)クラス名終了
RCT_MouseCursorChildWindow_ClassNameContains(対象ウィンドウの)クラス名を含む
RCT_MouseCursorChildWindow_ClassNameRegexMatch(対象ウィンドウの)クラス名正規表現
RCT_MouseCursorChildWindow_ProcessNameMatch(対象ウィンドウの)プロセス名一致
RCT_MouseCursorChildWindow_ProcessNameBegin(対象ウィンドウの)プロセス名開始
RCT_MouseCursorChildWindow_ProcessNameEnd(対象ウィンドウの)プロセス名終了
RCT_MouseCursorChildWindow_ProcessNameContains(対象ウィンドウの)プロセス名を含む
RCT_MouseCursorChildWindow_ProcessNameRegexMatch(対象ウィンドウの)プロセス名正規表現
RCT_MouseCursorChildWindow_ProcessPathMatch(対象ウィンドウの)プロセスパス一致
RCT_FindWindow_TitleMatch(対象ウィンドウの)タイトル一致
RCT_FindWindow_TitleBegin(対象ウィンドウの)タイトル開始
RCT_FindWindow_TitleEnd(対象ウィンドウの)タイトル終了
RCT_FindWindow_TitleContains(対象ウィンドウの)タイトルを含む
RCT_FindWindow_TitleRegexMatch(対象ウィンドウの)タイトル正規表現
RCT_FindWindow_ClassNameMatch(対象ウィンドウの)クラス名一致
RCT_FindWindow_ClassNameBegin(対象ウィンドウの)クラス名開始
RCT_FindWindow_ClassNameEnd(対象ウィンドウの)クラス名終了
RCT_FindWindow_ClassNameContains(対象ウィンドウの)クラス名を含む
RCT_FindWindow_ClassNameRegexMatch(対象ウィンドウの)クラス名正規表現
RCT_FindWindow_ProcessNameMatch(対象ウィンドウの)プロセス名一致
RCT_FindWindow_ProcessNameBegin(対象ウィンドウの)プロセス名開始
RCT_FindWindow_ProcessNameEnd(対象ウィンドウの)プロセス名終了
RCT_FindWindow_ProcessNameContains(対象ウィンドウの)プロセス名を含む
RCT_FindWindow_ProcessNameRegexMatch(対象ウィンドウの)プロセス名正規表現
RCT_FindWindow_ProcessPathMatch(対象ウィンドウの)プロセスパス一致
RCT_Global_FindWindow_TitleMatch(対象ウィンドウの)タイトル一致
RCT_Global_FindWindow_TitleBegin(対象ウィンドウの)タイトル開始
RCT_Global_FindWindow_TitleEnd(対象ウィンドウの)タイトル終了
RCT_Global_FindWindow_TitleContains(対象ウィンドウの)タイトルを含む
RCT_Global_FindWindow_TitleRegexMatch(対象ウィンドウの)タイトル正規表現
RCT_Global_FindWindow_ClassNameMatch(対象ウィンドウの)クラス名一致
RCT_Global_FindWindow_ClassNameBegin(対象ウィンドウの)クラス名開始
RCT_Global_FindWindow_ClassNameEnd(対象ウィンドウの)クラス名終了
RCT_Global_FindWindow_ClassNameContains(対象ウィンドウの)クラス名を含む
RCT_Global_FindWindow_ClassNameRegexMatch(対象ウィンドウの)クラス名正規表現
RCT_Global_FindWindow_ProcessNameMatch(対象ウィンドウの)プロセス名一致
RCT_Global_FindWindow_ProcessNameBegin(対象ウィンドウの)プロセス名開始
RCT_Global_FindWindow_ProcessNameEnd(対象ウィンドウの)プロセス名終了
RCT_Global_FindWindow_ProcessNameContains(対象ウィンドウの)プロセス名を含む
RCT_Global_FindWindow_ProcessNameRegexMatch(対象ウィンドウの)プロセス名正規表現
RCT_Global_FindWindow_ProcessPathMatch(対象ウィンドウの)プロセスパス一致
RCT_IME_EnglishIME状態が英語の場合(Negativeオプションで、英語ではない場合も可能)
RCT_TrayIconProcessNameMatchForWin10OrLower(Win 10専用)TrayIconプロセス検索
RCT_TrayIconTitleMatch(Win 11専用)TrayIconテキスト検索
RCT_TrayIconTitleRegexMatch(Win 11専用)TrayIconテキスト検索
RCT_Desktop_ImageMatchデスクトップとImageを比較
RCT_ActiveWindow_ImageMatch現在のアクティブウィンドウをImageと比較
RCT_IsScale_100_Percent_Ratio_96DPI is 100% (Ratio: 96)
RCT_IsScale_125_Percent_Ratio_120DPI is 125% (Ratio: 120)
RCT_IsScale_150_Percent_Ratio_144DPI is 150% (Ratio: 144)
RCT_IsScale_175_Percent_Ratio_168DPI is 175% (Ratio: 168)
RCT_IsScale_200_Percent_Ratio_192DPI is 200% (Ratio: 192)

サポート機能

名前 説明
RET_Activateウィンドウをアクティブ化
RET_Activate_Next_Windowウィンドウをアクティブ化(Z-Order上の次のウィンドウ)
RET_Activate_Last_Windowウィンドウをアクティブ化(Z-Order上の前のウィンドウ)
RET_Activate_Same_ProcessName_Next_Windowウィンドウをアクティブ化(同じプロセス名の次のウィンドウ)
RET_Activate_Same_ProcessName_Last_Windowウィンドウをアクティブ化(同じプロセス名の最後のウィンドウ。次のウィンドウではZ-Orderが崩れて2回実行した時に互いに切り替わるため追加)
RET_Activate_Same_ProcessPath_Next_Windowウィンドウをアクティブ化(同じパスのプロセスの次のウィンドウ)
RET_Activate_Same_ProcessPath_Last_Windowウィンドウをアクティブ化(同じパスのプロセスの最後のウィンドウ。次のウィンドウではZ-Orderが崩れて2回実行した時に互いに切り替わるため追加)
RET_Activate_Or_Same_ProcessName_Next_Window(アクティブ化されていない場合)ウィンドウをアクティブ化 | それ以外は前/次ウィンドウ(同じプロセス名の次のウィンドウ)
RET_Activate_Or_Same_ProcessName_Last_Window(アクティブ化されていない場合)ウィンドウをアクティブ化 | それ以外は前/次ウィンドウ(同じプロセス名の最後のウィンドウ。次のウィンドウではZ-Orderが崩れて2回実行した時に互いに切り替わるため追加)
RET_Activate_Or_Same_ProcessPath_Next_Window(アクティブ化されていない場合)ウィンドウをアクティブ化 | それ以外は前/次ウィンドウ(同じパスのプロセスの次のウィンドウ)
RET_Activate_Or_Same_ProcessPath_Last_Window(アクティブ化されていない場合)ウィンドウをアクティブ化 | それ以外は前/次ウィンドウ(同じパスのプロセスの最後のウィンドウ。次のウィンドウではZ-Orderが崩れて2回実行した時に互いに切り替わるため追加)
RET_Activate_All_Same_ProcessName_Window_Tileウィンドウをアクティブ化(同じプロセス名のすべてのウィンドウを横方向にタイル表示)
RET_Activate_All_Same_Class_Window_Tileウィンドウをアクティブ化(同じクラスのすべてのウィンドウを横方向にタイル表示)
RET_Activate_All_Same_ProcessId_Class_Window_Tileウィンドウをアクティブ化(同じプロセスとクラスのすべてのウィンドウを横方向にタイル表示)
RET_Show_All_Same_ProcessNameウィンドウを表示(同じプロセス名)
RET_Show_All_Same_Classウィンドウを表示(同じクラス)
RET_Show_All_Same_ProcessIdウィンドウを表示(同じプロセス)
RET_ExecuteAppアプリを実行
RET_ExecuteApp_HighIntegrityアプリを実行(High Integrity Level)
RET_ExecuteApp_MediumIntegrityアプリを実行(Normal Integrity Level)
RET_ExecuteApp_LowIntegrityアプリを実行(Low Integrity Level)
RET_Size_Fixedウィンドウサイズ変更(指定)
RET_Size_Percentウィンドウサイズ変更(指定)
RET_SizeUpウィンドウサイズ変更(拡大)
RET_SizeDownウィンドウサイズ変更(縮小)
RET_Moveウィンドウ移動(指定)
RET_MoveToウィンドウ移動(指定量だけ移動)
RET_MoveToCurrentMonitor_Leftウィンドウ移動(現在のモニターの左)
RET_MoveToCurrentMonitor_Rightウィンドウ移動(現在のモニターの右)
RET_MoveToCurrentMonitor_Topウィンドウ移動(現在のモニターの上)
RET_MoveToCurrentMonitor_Bottomウィンドウ移動(現在のモニターの下)
RET_MoveToCurrentMonitor_LeftTopウィンドウ移動(現在のモニターの左上)
RET_MoveToCurrentMonitor_LeftBottomウィンドウ移動(現在のモニターの左下)
RET_MoveToCurrentMonitor_RightTopウィンドウ移動(現在のモニターの右上)
RET_MoveToCurrentMonitor_RightBottomウィンドウ移動(現在のモニターの右下)
RET_MoveToCurrentMonitor_Centerウィンドウ移動(現在のモニターの中央)
RET_MoveToCurrentMonitor_Horizontal_Centerウィンドウ移動(現在のモニターの水平中央)
RET_MoveToCurrentMonitor_Vertical_Centerウィンドウ移動(現在のモニターの垂直中央)
RET_MoveToCurrentMonitor_Left_Percentウィンドウ移動(現在のモニターの左からPercent)
RET_MoveToCurrentMonitor_Top_Percentウィンドウ移動(現在のモニターの上からPercent)
RET_MoveToCurrentMonitor_Right_Percentウィンドウ移動(現在のモニターの右からPercent)
RET_MoveToCurrentMonitor_Bottom_Percentウィンドウ移動(現在のモニターの下からPercent)
RET_MoveToCurrentMonitor_LeftTop_Percentウィンドウ移動(現在のモニターのLeftTopからPercent)
RET_MoveToCurrentMonitor_LeftBottom_Percentウィンドウ移動(現在のモニターのLeftBottomからPercent)
RET_MoveToCurrentMonitor_RightTop_Percentウィンドウ移動(現在のモニターのRightTopからPercent)
RET_MoveToCurrentMonitor_RightBottom_Percentウィンドウ移動(現在のモニターのRightBottomからPercent)
RET_Window_Maximizeウィンドウ最大化
RET_Window_Minimizeウィンドウ最小化
RET_Window_Restore(最大化・最小化状態から...)復元
RET_Window_Restore_And_Minimizeウィンドウ最小化
RET_Sleep実行遅延(1/1000秒 milliseconds)
RET_KeyInput_ReplaceAndRollbackキーを変更して実行(既存Modifier状態: 取消 -> 入力 -> 復元)
RET_KeyInput_AppendAndRollbackキーを変更して実行(既存Modifier状態: 追加 -> 復元)
RET_KeyDownキー押下
RET_KeyUpキーを離す
RET_KeyInput_CapsLock_OnCapsLockをオン
RET_KeyInput_CapsLock_OffCapsLockをオフ
RET_TextInputテキスト入力(keybd_event)
RET_TextInput_UsingClipBoardテキスト入力(ClipBoardで貼り付け)
RET_MouseMove_Absoluteマウス移動(指定)
RET_MouseMove_Relativeマウス移動(相対)
RET_MouseMove_FromTarget_TopLeftマウス移動(From Target)
RET_MouseMove_FromTarget_TopRightマウス移動(From Target)
RET_MouseMove_FromTarget_BottomLeftマウス移動(From Target)
RET_MouseMove_FromTarget_BottomRightマウス移動(From Target)
RET_MouseMove_FromTarget_Centerマウス移動(From Target)
RET_MouseMove_PrevMonitor_Centerマウス移動(前のモニター)
RET_MouseMove_NextMonitor_Centerマウス移動(次のモニター)
RET_MouseMove_From_Desktop_ImageMatch_TopLeftマウス移動(Desktop画像マッチング)
RET_MouseMove_From_Desktop_ImageMatch_TopRightマウス移動(Desktop画像マッチング)
RET_MouseMove_From_Desktop_ImageMatch_BottomLeftマウス移動(Desktop画像マッチング)
RET_MouseMove_From_Desktop_ImageMatch_BottomRightマウス移動(Desktop画像マッチング)
RET_MouseMove_From_ActiveWindow_ImageMatch_TopLeftマウス移動(ActiveWindow画像マッチング)
RET_MouseMove_From_ActiveWindow_ImageMatch_TopRightマウス移動(ActiveWindow画像マッチング)
RET_MouseMove_From_ActiveWindow_ImageMatch_BottomLeftマウス移動(ActiveWindow画像マッチング)
RET_MouseMove_From_ActiveWindow_ImageMatch_BottomRightマウス移動(ActiveWindow画像マッチング)
RET_MouseClickマウス入力
RET_MouseDoubleClickマウス入力
RET_MousePositionSave_ExecutionContextマウス座標保存 - 今回の実行コンテキストのみ
RET_MousePositionLoad_ExecutionContextマウス座標ロード - 今回の実行コンテキストのみ
RET_MatchTrayIcon_ClickRCT_TrayIconProcessNameMatchでマッチしたTrayIconをクリック!
RET_MatchTrayIcon_DoubleClickRCT_TrayIconProcessNameMatchでマッチしたTrayIconをダブルクリック!
RET_MatchTrayIcon_EmulateClickRCT_TrayIconProcessNameMatchでマッチしたTrayIconをクリック!
RET_MatchTrayIcon_EmulateDoubleClickRCT_TrayIconProcessNameMatchでマッチしたTrayIconをダブルクリック!
RET_MatchTrayIcon_MouseMove_FromTarget_TopLeftRCT_TrayIconProcessNameMatchでマッチしたTrayIcon位置基準で移動
RET_MatchTrayIcon_MouseMove_FromTarget_CenterRCT_TrayIconProcessNameMatchでマッチしたTrayIcon位置基準で移動
RET_CopyCurrentMousePointerSelItem_SysListView現在のマウスポインター位置のSysListView32の選択アイテムをコピー
RET_CopyCurrentMousePointerAllItem_SysListView現在のマウスポインター位置のSysListView32のすべてのアイテムをコピー
RET_CopyCurrentMousePointerCursorItemText_SysListView現在のマウスポインター位置のSysListView32のすべてのアイテムをコピー
RET_Reset_Keyboard_Modifier_ContextContext初期化(異常動作時に使用)
RET_Pause_LightWeightHotKeyLWHK無効化
RET_ChainRule_With_CheckConditionChain Rule(条件実行)
RET_ChainRule_Skip_Condition_AlwaysExecuteChain Rule(条件なしで実行)

Demo

  • 次の動画はCtrl+Win+Cを押す時にSysListView32(=CListCtrl)のデータをクリップボードにコピーする機能です。

  • 次の動画はWin+S+Eを押す時にSteamのトレイアイコンをダブルクリックしてSteamアプリをオープンする機能です。

  • 次の動画はWin+F1を押す時に同じ名前のプロセスの他のウィンドウが活性化になる機能です。

要求仕様

  • Windows 10, 11
  • 64bit (AMD64)
  • Visual C++ Runtime (2015-2022)
  • DirectX 9.0 or above

ベース技術

  • Windows Hook

既知の問題

  • (Hook APIを利用しているので)アンチウイルスでDLLをLight Weight HotKeyプロセスにインジェクションを行って監視する事が多数あり、反応が遅れる事が発生する可能性があります。
    • LightWeight HotKeyはウィンドウズが提供するHook Callbackで(ユーザーが入力したルールのチェックなどの)単純なロジックのみ行われているため、システム性能の低下には全く支障などはありません。
    • 確認されたアンチウイルスのリスト
      • ESET
      • COMODO
      *特にエンタプライズ用のアンチウイルス製品で意味のない強力な検査を行っているため、多数のファイルのロードをしたり作成したりするランサムウェアのような動作をするVisual Studio、Intellij(IDEやCompilerなどの製品)の反応が遅れるのと似たような事が発生します。
  • nProtect GameGuardと衝突(GameGuardアプリの互換性問題)
    • nProtect GameGuardからキーのエミュレーションなどの操作をブロックされたため異常動作する可能性があります。
    • 互換性に問題があるアプリ
      • GranSaga

インストール方法

  1. ダウンロードしたファイルの圧縮を解凍
  2. LWHK.exeを起動
  3. (希望の)ルールの入力
  4. ウィンドウズの起動の時自動スタート使用とする場合
    1. オプションに入る
    2. インストールする

トラブルシューティング

  • HighIntegrity Levelのウィンドウのサイズなど変更出来ない場合
    1. (管理者権限)LWHK.exeを起動
  • システムの性能が(最初起動した時期より)低下になる場合
    • アプリを再起動してアンチウイルスがインジェクションしたDLLを初期化します。
      • アンチウイルスがまたDLLのインジェクションの行動を行うため、時間が進んでからまた反応が遅れる事が発生する可能性があります。
    • または、アンチウイルスアプリでShell Code Injectionなどの監視オプションで「LWHK.exe」プロセスをホワイトリストに登録します。
  • 削除
    1. オプションに入る
    2. アンインストール