アプリケーションをすばやく切り替えるための小さなトリック

前文



長い間、私はLogitechマウス-MX300およびMX310を使用してきました。 ホイールの上に追加のボタンがあり、さまざまな機能を掛けることができます。 古いドライバー(MouseWare)では、これらの機能の中に「Recall Application」があり、それは前のアクティブウィンドウに切り替わりました。Alt+ Tabを1回押すとほぼ同じです。 私はすぐにこの機会が好きでした。あるウィンドウに切り替え、そこで何かをする(たとえば、行をコピーする)後、戻る(それぞれ、このコピーした行を貼り付ける)必要がある場合がよくあります。 この場合、Alt + Tabはあまり便利ではありません(Ctrl + Cの組み合わせから左手を取り除いてから、Ctrl + Vを押すと前の位置に戻る必要があるため)。



しかし、私は自分でWindows XP x64をインストールしましたが、MouseWareは64ビットシステムでは使用できないことがわかりました。 MX310の場合、より新しいSetPointユーティリティが発見されましたが、Recall Application機能はもうありません。 幸い、Alt + Tabを設定して目的のボタンへのショートカットを送信できましたが、切り替え時のタスクリストウィンドウの点滅は少し面倒でした。 だから、怠lazを克服して、この欠点を取り除くのに役立つ小さなユーティリティを書くことができました。



アンブラ



実際、ユーティリティに必要なものは1つだけです。バックグラウンドでハングし、ボタンを押すことに関する信号を受信した後、「隣接」ウィンドウに切り替えます。 タスクは、私が最初に思ったほど簡単ではありませんでした。 SetPointで使用可能なアクションのリストには、「6番目のボタンを押すことに関する信号を送信する」などのアクションがないため、ボタンを押すことに関する信号を直接受信することはできません。 そのため、ボタンを押すだけで、キーの組み合わせをエミュレートすると、プログラムはすでにこの組み合わせをキャッチできます。 当然、通常の作業では未使用のものを選択する必要があります。 Ctrl + Alt + Shift + Zを選択しました。



2番目の問題は、適切なウィンドウを選択することでした。 GetWindow呼び出し(hwnd、GW_HWNDNEXT)を使用してアプリケーションのZスタックをナビゲートできますが、これらのウィンドウの中には、切り替える必要のないウィンドウが多数あります。 たとえば、非表示。 表示されているウィンドウのみを残す場合でも、通常のAlt + Tabリストにない他のトップレベルウィンドウが多数あります。 ここでは満足のいく解決策が見つかりませんでした。 Stack overflowで1つのオプションをGoogleで検索できました 、ウィンドウの正しいリストを取得できませんでした。 TaskSwitchXPのソースコードもありますが、私のニーズに合わせてコードを調整しようとして失敗しました(追加のウィンドウがリストに追加されました)。 コードを完全に理解できなかったので、何か間違ったことをしたか、コードが元々そのような不適切な使用のために設計されていませんでした。 (ただし、引き続き対処します。)最後に、私は独自の調査を実施し、「正しい」ウィンドウを選択するための経験的条件を決定しました(これらの条件を最後にリストします)。 結果のプログラムコードは1ページに収まります。



int WinMainCRTStartup(void) { if (!RegisterHotKey(NULL, 0, MOD_CONTROL | MOD_SHIFT | MOD_ALT, 'Z')) return 1; MSG msg = {0}; while (GetMessage(&msg, NULL, 0, 0)) { if (msg.message == WM_HOTKEY) { HWND current_wnd = GetForegroundWindow(); if (current_wnd == NULL) continue; // Find top-level owner of the current window HWND owner = current_wnd; do { current_wnd = owner; owner = GetWindow(current_wnd, GW_OWNER); } while ((owner != NULL) && IsWindowVisible(owner)); // Find next window in Z-stack to switch to do { current_wnd = GetWindow(current_wnd, GW_HWNDNEXT); if (current_wnd == NULL) break; owner = GetWindow(current_wnd, GW_OWNER); } while (!IsWindowVisible(current_wnd) || ((GetWindowLongPtr(current_wnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW) != 0) || ((owner != NULL) && IsWindowVisible(owner))); if (current_wnd != NULL) SetForegroundWindow(current_wnd); } } UnregisterHotKey(NULL, 0); return 0; }
      
      





小さな技術的なコメント



All Articles