AutoHotkey - ウィンドウをタスクバー内に固定する

AutoHotkey - ウィンドウをタスクバー内に固定する

オートホットキーを使用してこれを実現する方法はありますか?いくつかのウィンドウを、開いているプログラムの数に関係なく、常にタスクバーの右上に表示したいです。たとえば、現在は次のようになっています。これしかし、メモ帳は常にタスクバーの右端に置きたいのです。例えば、これしたがって、いくつのプログラムを開いても、タスクバー上でメモ帳が常に右端に表示されるようにしたいのです。

私は Windows 8.1 と最新バージョンの AutoHotkey を使用しています。説明: メモ帳のウィンドウ自体を画面の右端に配置したくありません。 いいえ、その代わりにメモ帳のタスクバーのアイコンだけを右端に配置したいのです。 つまり、たとえば新しいプログラムを開いたときに、アイコンが自動的に右に移動され、メモ帳のアイコンの後にアイコンが表示されないようにします。

インターネットで検索しましたが、役に立つものや似たようなものは見つかりませんでした。そこで、メモ帳のアイコンを常に右側に表示するようにしました。開いたメモ帳がすべて右側に移動されるか、開いているメモ帳だけが右側に表示されるかは関係ありません。4 つのメモ帳を開いて、コンピューターの電源を切るまで保持しておけば、決して閉じることはありません。

どうすれば実現できるでしょうか? AutoHotkey は非常に優れたソフトウェアであり、多くの機能強化が施されているため、必ず方法があるはずです。

よろしくお願いします。このサイトでの最初の質問ですので、敬意を持ってお願いします。ありがとうございます。

答え1

私の知る限り、タスクバー上のアイコンを移動する唯一の方法はドラッグすることなので、これはプログラムで手順を実行する AHK スクリプトです。

^F1::
    toggle = true
    Window = 0
    while (toggle) {
        OldWindow = %Window%
        WinGet Window, List

        if (Window > OldWindow) {
            SetTitleMatchMode, RegEx
            IfWinExist, Notepad$
            {
                WinActivate
            } Else {
                ; MsgBox Cannot find Notepad window.
                Continue
            }
            ; absolute coordinate
            CoordMode Pixel, Screen
            CoordMode Mouse, Screen
            Sleep, 100 ; wait for the Notepad icon to be fully highlighted, because Windows have animation of lighting icon
            ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *5 *TransWhite D:\np.bmp
            ; allow some variation because Windows have anti-aliasing etc.

            ; ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *10 *Icon1 %A_WinDir%\system32\notepad.exe
            ; because of some reason the above command does not work
            if ErrorLevel = 2
                MsgBox Could not conduct the search.
            else if ErrorLevel = 1
                MsgBox Icon could not be found on the screen.
            else {
                MouseGetPos OldX, OldY
                SetDefaultMouseSpeed, 0
                MouseMove, %FoundX%, %FoundY%
                Click down left
                MouseMove, A_ScreenWidth, %FoundY% ; move the mouse all the way to the right
                Click up left
                MouseMove, %OldX%, %OldY% ; move mouse to old position
            }
        }

        Sleep, 500 ; can be omitted
    }
Return

^F2::
    toggle = false
Return

ノート:

  • 何らかの理由で使用できない場合や、同様の理由で、メモ帳にフォーカスがあるときにメモ帳トレイ アイコンで構成される*Icon1 %A_WinDir%\system32\notepad.exeファイルを提供する必要があります。D:\np.bmp
  • 押す^F1とオンになり、 を押す^F2とオフになります。
  • メモ帳タスク アイコンをドラッグするために使用される部分は、報告されたウィンドウの数がWinGet増えるたびに、つまり新しいウィンドウを開くたびに実行されます。
  • メモ帳ウィンドウは、右にドラッグされるたびにフォーカスされます。
  • 無限ループ ( ) を使用する以外に、コマンドを毎回実行する方法はありませんwhile (toogle)。CPU を消費する可能性があります。

答え2

この問題に対する組み込みまたは低ハードルのソリューションは知りません。この機能が本当に必要な場合は、プロセスを指定してタスク バー上のウィンドウ ボタンを再配置できる独自のヘルパー アプリを作成する必要があると思います。これは実現可能ですが、Win32 と C++/C# に関する知識が必要です。私は 30 分間 (個人的な制限) 試してみました。

私がやったことは次のとおりです: このスレッドは完璧な出発点です:システムトレイアイコンを持つプロセスを取得する方法 ポイント 6. 古い (32 ビット) バージョンの Windows に有効なソリューションを提供します。タスクバーのウィンドウボタンを整理するツール 残念ながら、64 ビット OS および Windows 10 では動作しません。

それでも、サンプルの調査中に、6 で提供されているいくつかの発見がありました。Windows 10 でタスク バーを見つけるには、次のコードを使用します。

...
//IntPtr hToolbar = User32.FindWindowEx( hTask, IntPtr.Zero, "ToolbarWindow32", null ); xp +
IntPtr taskBarWnd = User32.FindWindowEx(hTask, IntPtr.Zero, "MSTaskListWClass", null);

TBBUTTON 構造体の 64 ビット定義が必要になります。

[StructLayout(LayoutKind.Sequential)]
public struct TBBUTTON
{
    public int iBitmap;
    public int idCommand;
    [StructLayout(LayoutKind.Explicit)]
    private struct TBBUTTON_U
    {
        [FieldOffset(0)]
        public byte fsState;
        [FieldOffset(1)]
        public byte fsStyle;
        [FieldOffset(0)]
        private IntPtr bReserved;
    }
    private TBBUTTON_U union;
    public byte fsState { get { return union.fsState; } set { union.fsState = value; } }
    public byte fsStyle { get { return union.fsStyle; } set { union.fsStyle = value; } }
    public UIntPtr dwData;
    public IntPtr iString;
}

これは、独自のソリューションを構築するための良い出発点となるはずです。

もう一つの役に立つ出発点は、7+ タスクバー調整ツール、これは非常に便利なタスクバーの調整機能を備えています (名前が示すとおり)。7+TT には、ほとんどの (黒魔術) を実行するライブラリも用意されており、DIY ソリューションの開始点としても使用できます (さらに、Windows 1607 でも動作します。タスクバーの内容を印刷するサンプルをご覧ください。AppId は、適切なタスクバー ボタン ウィンドウ/ボタン グループを見つけるための優れたフックです)。

幸運を。

アップデート
7+TT Lib の助けを借りれば、目標の達成は非常に簡単になります。
ここ作業サンプル作成しました (アーカイブにはサンプルのソースと、x64/Release フォルダー内の taskbar_pusher というバイナリが含まれており、これは Windows 7 - 10 の最新リリース v1709 まで動作するはずです)。

タスクバーの最後尾にプッシュするボタン グループの AppId を、コマンド ライン パラメータとして次のように指定する必要があります。

./taskbar_pusher {1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\notepad.exe

私のツールの CLI 出力から AppId を取得します。AHK
を使用すると、このようにパラメーター化して呼び出すことができるはずです (ただし、私は AHK にあまり詳しくありません)。

PS: セカンダリ タスクバーに問題があったため、それを検出するためのコードを無効にしました。

関連情報