AutoHotkey - 창을 작업 표시줄 오른쪽에 유지

AutoHotkey - 창을 작업 표시줄 오른쪽에 유지

자동 핫키를 사용하여 이를 달성할 수 있는 방법이 있습니까? 몇 개의 프로그램을 열더라도 일부 창이 항상 작업 표시줄의 오른쪽 상단에 표시되도록 하고 싶습니다. 예를 들어 현재는 다음과 같습니다.이것. 하지만 저는 메모장이 항상 작업 표시줄의 오른쪽 끝에 있기를 바랍니다. 예를 들면 다음과 같습니다.이것. 그래서 아무리 많은 프로그램을 열어도 작업 표시줄의 메모장은 항상 맨 오른쪽에 있기를 바랍니다.

저는 Windows 8.1과 최신 버전의 AutoHotkey를 사용하고 있습니다. 몇 가지 설명: 저는 메모장의 창 자체가 화면의 맨 오른쪽에 있는 것을 원하지 않습니다. 아니요, 대신 메모장의 작업 표시줄에 있는 아이콘만 맨 오른쪽에 있도록 하고 싶습니다. 따라서 예를 들어 새 프로그램을 열면 아이콘이 자동으로 오른쪽으로 이동하여 메모장의 아이콘 뒤에 아이콘이 표시되지 않기를 원합니다.

인터넷에서 검색했는데 유용하거나 유사한 것을 찾지 못했습니다. 그래서 제가 하려는 것은 메모장의 아이콘을 항상 오른쪽에 두는 것입니다. 내가 연 모든 메모장이 오른쪽으로 이동하는지 아니면 그냥 열어도 오른쪽에 있는지 상관하지 않습니다. 상관없습니다. 저는 메모장 4개를 열어서 컴퓨터를 끌 때까지 보관하기만 하면 됩니다. 절대 닫지 마세요.

그것을 달성하는 방법? AutoHotkey는 매우 좋은 소프트웨어이고 많은 개선 사항이 있기 때문에 분명 방법이 있을 것이라고 확신합니다.

미리 감사드립니다. 이것은 이 사이트에 대한 나의 첫 번째 질문이므로 존중해 주시기 바랍니다. 감사하다.

답변1

AFAIK 작업 표시줄에서 아이콘을 이동하는 유일한 방법은 아이콘을 드래그하는 것입니다. 따라서 프로그래밍 방식으로 절차를 수행하는 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에서 제공하는 샘플을 사용하여 탐색하는 동안 발견한 몇 가지 사항은 다음과 같습니다. Window 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에 대해 잘 알지 못하지만).

추신: 보조 작업 표시줄에 문제가 있어서 이를 감지하는 코드를 비활성화했습니다.

관련 정보