web-dev-qa-db-ja.com

AutoHotkey-ウィンドウをタスクバーに表示したままにする

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

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

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

それを達成する方法は? AutoHotkeyは非常に優れたソフトウェアであり、多くの機能強化が施されているため、方法があるはずです。

前もって感謝します。これはこのサイトでの私の最初の質問ですので、敬意を払ってください。感謝。

3
user782364756

タスクバーでアイコンを移動する唯一の方法はアイコンをドラッグすることです。したがって、これはプログラムで手順を実行する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
user202729

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

これは私がしたことです:このスレッドは完璧な出発点です: システムトレイアイコンのあるプロセスを取得する方法 ポイント6.古い(32ビット)バージョンのWindowsの実用的なソリューションを提供します: タスクバーのウィンドウボタンを注文するためのツール 残念ながら、64ビットOSおよびWindows10では機能しません。

それでも、サンプルを使用して探索中に行ったいくつかの発見は、6で提供されています。ウィンドウ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;
}

これは、独自のソリューションの良い出発点になるはずです。

もう1つの役立つ出発点は、 7+タスクバーの微調整 です。これには、非常に便利なタスクバーの微調整がいくつかあります(名前が示すように)。 7 + TTは、ほとんどの(黒)魔法を実行するライブラリも提供し、DIYソリューションの開始点としても機能します(さらに、Windows1607でも機能します。印刷タスクバーのコンテンツサンプルをご覧ください; AppIdここに、適切なタスクバーボタンウィンドウ/ボタングループを見つけるための良いフックがあります)。

幸運を。

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

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

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

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

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

1
wp78de