AutoHotkey - Fenster direkt in der Taskleiste halten

AutoHotkey - Fenster direkt in der Taskleiste halten

Gibt es eine Möglichkeit, dies mit Autohotkey zu erreichen: Ich möchte, dass einige Fenster immer oben rechts in der Taskleiste angezeigt werden, unabhängig davon, wie viele Programme ich geöffnet habe. Derzeit ist es beispielsweise soDas. Aber ich möchte, dass Notizblöcke immer ganz rechts in der Taskleiste angezeigt werden. Also zum Beispiel wieDas. Egal, wie viele Programme ich öffne, ich möchte, dass die Notizblöcke immer ganz rechts in der Taskleiste angezeigt werden.

Ich verwende Windows 8.1 und die neueste Version von AutoHotkey. Einige Erklärungen: Ich möchte nicht, dass das Fenster des Notizblocks selbst ganz rechts auf dem Bildschirm angezeigt wird. Nein, stattdessen möchte ich, dass nur das Symbol in der Taskleiste des Notizblocks ganz rechts angezeigt wird. Wenn ich also beispielsweise neue Programme öffne, möchte ich, dass das Symbol automatisch nach rechts verschoben wird, sodass hinter dem Symbol des Notizblocks keine Symbole erscheinen.

Ich habe im Internet gesucht und nichts Nützliches oder Ähnliches gefunden. Ich versuche also, die Symbole der Notizblöcke immer rechts zu platzieren. Es ist mir egal, ob alle Notizblöcke, die ich öffne, nach rechts verschoben werden oder nur die geöffneten rechts bleiben. Das ist mir egal. Ich öffne einfach 4 Notizblöcke und behalte sie, bis ich meinen Computer ausschalte, also werde ich sie nie schließen.

Wie erreicht man das? Ich bin sicher, dass es einen Weg geben muss, denn AutoHotkey ist eine sehr gute Software und hat viele Verbesserungen.

Vielen Dank im Voraus. Dies ist meine erste Frage auf dieser Site, also seien Sie bitte respektvoll. Danke.

Antwort1

Soweit ich weiß, können Symbole in der Taskleiste nur durch Ziehen verschoben werden. Dies ist also ein AHK-Skript, das den Vorgang programmgesteuert ausführt:

^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

Anmerkungen:

  • Aus irgendeinem Grund kann ich „ *Icon1 %A_WinDir%\system32\notepad.exeoder ähnliches“ nicht verwenden. Sie müssen eine Datei bereitstellen, D:\np.bmpdie aus dem Editor-Tray-Symbol besteht, wenn der Editor im Fokus ist.
  • ^F1Zum Einschalten drücken , ^F2zum Ausschalten.
  • Der Teil, der zum Ziehen des Editor-Aufgabensymbols verwendet wird, wird jedes Mal ausgeführt, wenn die gemeldete Fensteranzahl WinGetzunimmt, d. h. wenn Sie ein neues Fenster öffnen.
  • Das Notizblockfenster wird jedes Mal fokussiert, wenn es nach rechts gezogen wird.
  • Ich kenne keine andere Möglichkeit, den Befehl jedes Mal auszuführen, als eine Endlosschleife zu verwenden ( while (toogle)). Das kann CPU-Leistung verbrauchen.

Antwort2

Mir ist keine integrierte oder einfache Lösung für dieses Problem bekannt. Wenn Sie diese Funktion wirklich benötigen, müssen Sie vermutlich Ihre eigene Hilfsanwendung erstellen, mit der Sie einen Prozess angeben und dessen Fensterschaltfläche in der Taskleiste neu anordnen können. Dies ist möglich, erfordert jedoch einige Kenntnisse in Win32 und C++/C#. Ich habe es 30 Minuten lang ausprobiert (mein persönliches Limit).

Das habe ich getan: Dieser Thread ist der perfekte Ausgangspunkt:So erhalten Sie die Prozesse mit dem Systray-Symbol Punkt 6. Bietet Ihnen eine funktionierende Lösung für veraltete (32-Bit-)Versionen von Windows:Ein Tool zum Anordnen der Fensterschaltflächen in Ihrer Taskleiste Leider funktioniert es nicht unter 64-Bit-Betriebssystemen und Windows 10.

Dennoch habe ich bei meinen Untersuchungen mit dem in 6 bereitgestellten Beispiel einige Entdeckungen gemacht: Um die Taskleiste unter Windows 10 zu finden, verwenden Sie den folgenden Code:

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

Sie benötigen eine 64-Bit-Definition der TBBUTTON-Struktur:

[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;
}

Dies sollte Ihnen einen guten Ausgangspunkt für eine eigene Lösung bieten.

Ein weiterer hilfreicher Ausgangspunkt könnte sein,7+ Taskleisten-Optimierer, das einige sehr praktische Taskleisten-Optimierungen enthält (wie der Name schon sagt). 7+TT bietet auch eine Bibliothek, die den Großteil der (schwarzen) Magie für Sie erledigt und auch als Ausgangspunkt für eine DIY-Lösung dienen kann (außerdem funktioniert es sogar unter Windows 1607. Sehen Sie sich das Beispiel zum Drucken von Taskleisteninhalten an; AppId ist hier ein guter Anhaltspunkt, um das richtige Taskleistenschaltflächenfenster/die richtige Schaltflächengruppe zu finden).

Viel Glück.

Aktualisieren
Mit Hilfe der 7+TT Lib ist Ihr Ziel ganz einfach zu erreichen.
Hierist einArbeitsbeispielIch habe Folgendes erstellt (das Archiv enthält den Quellcode meines Beispiels sowie eine Binärdatei im Ordner x64/Release namens „taskbar_pusher“, die mit Windows 7 – 10 bis zur neuesten Version v1709 funktionieren sollte).

Als Kommandozeilenparameter müssen Sie die AppId der Buttongruppe angeben, die Sie an das hintere Ende Ihrer Taskleiste verschieben möchten:

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

Sie erhalten die AppId aus der CLI-Ausgabe meines Tools.
Sie sollten es so parametrisiert mit AHK aufrufen können (obwohl ich mit AHK nicht sehr vertraut bin).

PS: Ich hatte einige Probleme mit meiner sekundären Taskleiste und habe daher den Code zur Erkennung deaktiviert.

verwandte Informationen