AutoHotkey - закрепить окно на панели задач

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)). Это может потреблять ресурсы процессора.

решение2

Я не знаю ни одного встроенного или низкоуровневого решения этой проблемы. Если вам действительно нужно это функционально, я думаю, вам придется создать собственное вспомогательное приложение, которое позволит вам указать процесс и переставить его кнопку окна на панели задач. Этого можно добиться, но для этого требуются некоторые знания Win32 и C++/C#. Я пробовал это в течение 30 минут (мой личный предел).

Вот что я сделал: эта ветка — идеальная отправная точка:Как получить процессы, имеющие значок в системном трее Пункт 6. Дает вам работающее решение для устаревших (32-битных) версий Windows:Инструмент для упорядочивания кнопок окон на панели задач. К сожалению, он не работает под 64-битной ОС и Windows 10.

Тем не менее, некоторые открытия, которые я сделал во время своего исследования примера, приведены в 6: Чтобы найти панель задач в Windows 10, используйте следующий код:

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

Вам понадобится 64-битное определение структуры TBBUTTON:

[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 также предлагает библиотеку, которая делает большую часть (черной) магии за вас и может также служить отправной точкой для самостоятельного решения (плюс он работает даже в Windows 1607. Взгляните на пример содержимого панели задач печати; AppId здесь — хороший способ найти нужное окно/группу кнопок панели задач).

Удачи.

Обновлять
С помощью 7+TT Lib ваша цель будет довольно легко достигнута.
Здесьэторабочий образецЯ сделал (архив содержит исходный код моего примера, а также двоичный файл в папке x64/Release, называемый taskbar_pusher, который должен работать с Windows 7 - 10 вплоть до последней версии v1709).

Вам необходимо указать AppId группы кнопок, которую вы хотите поместить в заднюю часть панели задач, как параметр командной строки:

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

AppId вы получаете из CLI-вывода моего инструмента.
Вы должны иметь возможность вызвать его параметризацию таким образом с помощью AHK (хотя я не очень хорошо знаком с AHK).

PS: У меня возникли некоторые проблемы с дополнительной панелью задач, поэтому я отключил код для ее обнаружения.

Связанный контент