Что нового

альтернативный способ переключения окон в windows

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Zaramot [?]
мне нужна правая кнопка мыши

Код:
#NoTrayIcon
#include <GUIToolbar.au3>
#include <Array.au3>
#include "MouseOnEvent.au3"

Opt("WinWaitDelay", 1)

HotKeySet("^+e", "_Exit") ;Выход по <Ctrl + Shift + E>

Global $sLast_NextBack_Window = ""
Global $sLast_BackNext_Window = ""  

Global $iScrollDown = 0
Global $iScrollUp = 0
Global $iSecondaryDown = 0
Global $iSecondaryUp = 0

Global $iSwitchNext = 1
Global $iSwitchBack = 2
Global $iSwitchNextBack = 3
Global $iSwitchBackNext = 4

_MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT, "WHEELSCROLLDOWN_EVENT", "", "", 0, -1)
_MouseSetOnEvent($MOUSE_WHEELSCROLLUP_EVENT, "WHEELSCROLLUP_EVENT", "", "", 0, -1)
_MouseSetOnEvent($MOUSE_SECONDARYDOWN_EVENT, "SECONDARYDOWN_EVENT", "", "", 0, -1)
_MouseSetOnEvent($MOUSE_SECONDARYUP_EVENT, "SECONDARYUP_EVENT", "", "", 0, -1)

While 1
    Sleep(10)
	
	If $iSecondaryDown And $iScrollDown Then
		$iScrollDown = 0
		_SwitchTaskBarWindow_Proc($iSwitchBack)
	ElseIf $iScrollDown Then
		$iScrollDown = 0
	EndIf
	
	If $iSecondaryDown And $iScrollUp Then
		$iScrollUp = 0
		_SwitchTaskBarWindow_Proc($iSwitchNext)
	ElseIf $iScrollUp Then
		$iScrollUp = 0
	EndIf
WEnd

Func WHEELSCROLLDOWN_EVENT()
	$iScrollDown = 1
	If $iSecondaryDown Then Return 1
EndFunc

Func WHEELSCROLLUP_EVENT()
	$iScrollUp = 1
	If $iSecondaryDown Then Return 1
EndFunc

Func SECONDARYDOWN_EVENT()
	$iSecondaryDown = 1
EndFunc

Func SECONDARYUP_EVENT()
	$iSecondaryDown = 0
	If $iScrollDown Or $iScrollUp Then Return 1
EndFunc

Func _SwitchTaskBarWindow_Proc($iMode)
    Local $sActivate_Window = "", $hParent_Active_Wnd = _WinAPI_GetAncestor(WinGetHandle(""), $GA_ROOTOWNER)
    Local $aTaskBarWindows = _WinListTaskBarWindowsEx(1)
    
    For $i = 1 To $aTaskBarWindows[0][0]
        If WinActive($aTaskBarWindows[$i][0]) Or $aTaskBarWindows[$i][0] = $hParent_Active_Wnd Then
            Switch $iMode
                Case $iSwitchBack ;Предыдущее окно (1-ое по счёту)
                    If $i = 1 Then $i = $aTaskBarWindows[0][0] + 1
                    $sActivate_Window = $aTaskBarWindows[$i - 1][0]
                Case $iSwitchNext ;Следующее окно (1-ое по счёту)
                    If $i = $aTaskBarWindows[0][0] Then $i = 0
                    $sActivate_Window = $aTaskBarWindows[$i + 1][0]
                Case $iSwitchNextBack ;Следующее <> Предыдущее окно
                    If $sLast_NextBack_Window <> $aTaskBarWindows[$i][0] Then $sLast_NextBack_Window = ""
                    
                    If $sLast_NextBack_Window = "" Then
                        If $i = $aTaskBarWindows[0][0] Then $i = 0
                        $sActivate_Window = $aTaskBarWindows[$i + 1][0]
                        $sLast_NextBack_Window = $sActivate_Window
                    Else
                        If $i = 1 Then $i = $aTaskBarWindows[0][0] + 1
                        $sActivate_Window = $aTaskBarWindows[$i - 1][0]
                        $sLast_NextBack_Window = ""
                    EndIf
                Case $iSwitchBackNext ;Предыдущее <> Следующее окно
                    If $sLast_BackNext_Window <> $aTaskBarWindows[$i][0] Then $sLast_BackNext_Window = ""
                    
                    If $sLast_BackNext_Window = "" Then
                        If $i = 1 Then $i = $aTaskBarWindows[0][0] + 1
                        $sActivate_Window = $aTaskBarWindows[$i - 1][0]
                        $sLast_BackNext_Window = $sActivate_Window
                    Else
                        If $i = $aTaskBarWindows[0][0] Then $i = 0
                        $sActivate_Window = $aTaskBarWindows[$i + 1][0]
                        $sLast_BackNext_Window = ""
                    EndIf
            EndSwitch
            
            ExitLoop
        EndIf
    Next
    
    ;Не найдены активные окна...
    If $sActivate_Window = "" Then
        Switch $iMode
            Case $iSwitchBack
                ;Активируем последнее окно
                $sActivate_Window = $aTaskBarWindows[$aTaskBarWindows[0][0]][0]
            Case Else
                ;Активируем первое окно
                $sActivate_Window = $aTaskBarWindows[1][0]
        EndSwitch
    EndIf
    
    WinActivate($sActivate_Window)
EndFunc

Func _WinListTaskBarWindowsEx($iListSort=1)
    Local $hToolbar = ControlGetHandle("[CLASS:Shell_TrayWnd]", "", "ToolbarWindow323")
    If @error Then $hToolbar = ControlGetHandle("[CLASS:Shell_TrayWnd]", "", "ToolbarWindow322")
    If @error Then Return SetError(1, 0, 0)
    
    Local $aWinList = WinList()
    Local $aRet_List[$aWinList[0][0] + 1][2], $iToolbarButtonIndex
    
    For $i = 1 To $aWinList[0][0] Step 1
        If Not BitAND(WinGetState($aWinList[$i][1]), 2) Then ContinueLoop
        
        $iToolbarButtonIndex = _WinAPI_FindToolbarButton($aWinList[$i][1], $hToolbar)
        
        If $iToolbarButtonIndex > 0 Then
            $aRet_List[0][0] += 1
            $aRet_List[$aRet_List[0][0]][0] = $aWinList[$i][1]
            $aRet_List[$aRet_List[0][0]][1] = $iToolbarButtonIndex
        EndIf
    Next
    
    If $aRet_List[0][0] = 0 Then Return SetError(2, 0, 0)
    
    ReDim $aRet_List[$aRet_List[0][0] + 1][2]
    If $iListSort Then _ArraySort($aRet_List, 0, 1, $aRet_List[0][0], 1)
    
    Return $aRet_List
EndFunc

Func _WinAPI_FindWindowEx($hParent, $hChild, $sClass, $sWindow)
    ; must create structs and use ptrs to account for passing a true NULL as classname or window title
    ; simply using "wstr" and "" does NOT work
    Local $sStruct1, $sStruct2
    
    If $sClass = "" Then
        $sClass = 0
    Else
        $sStruct1 = DllStructCreate("wchar[256]")
        DllStructSetData($sStruct1, 1, $sClass)
        $sClass = DllStructGetPtr($sStruct1)
    EndIf
    
    If $sWindow = "" Then
        $sWindow = 0
    Else
        $sStruct2 = DllStructCreate("wchar[256]")
        DllStructSetData($sStruct2, 1, $sWindow)
        $sWindow = DllStructGetPtr($sStruct2)
    EndIf
    
    Local $aRet = DllCall("user32.dll", "hwnd", "FindWindowExW", "hwnd", $hParent, "hwnd", $hChild, "ptr", $sClass, "ptr", $sWindow)
    
    $sStruct1 = 0
    $sStruct2 = 0
    
    Return $aRet[0]
EndFunc

Func _WinAPI_FindToolbarButton($hWnd, $hTB)
    Local $iReturn = -1, $iPID, $hProcess, $sStruct = DllStructCreate("ptr")
    
    ; open process owning toolbar control
    _WinAPI_GetWindowThreadProcessId($hTB, $iPID)
    
    $hProcess = _WinAPI_OpenProcess(0x410, False, $iPID)
    
    If $hProcess Then
        Local $iCount = _GUICtrlToolbar_ButtonCount($hTB)
        
        For $i = 0 To $iCount - 1
            Local $iID = _GUICtrlToolbar_IndexToCommand($hTB, $i)
            
            ; button param is ptr to owner's window handle, stored in target process's memory space
            Local $dwData = _GUICtrlToolbar_GetButtonParam($hTB, $iID)
            
            ; read the window handle from the explorer process
            Local $aRet = DllCall("kernel32.dll", "int", "ReadProcessMemory", "ptr", _
                    $hProcess, "ptr", $dwData, "ptr", DllStructGetPtr($sStruct), "uint", 4, "uint*", 0)
            
            If $aRet[5] Then
                If $hWnd = DllStructGetData($sStruct, 1) Then
                    $iReturn = $i
                    ExitLoop
                EndIf
            EndIf
        Next
        
        _WinAPI_CloseHandle($hProcess)
    EndIf
    
    Return $iReturn
EndFunc

Func _Exit()
    Exit
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Кстати так переключаются вкладки в браузере Opera :smile:
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Огромное тебе человеческое СПАСИБО !!!!
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
CreatoR, подскажи, пожалуйста, что нужно здесь (ответ #33 данной темы) изменить, чтобы убрать возможность закрывать (по нажатию ctrl + shift + R) работающий скрипт

очевидно, требуется убрать строку:

Код:
Global $sExit_HT                    = 0x0352 ;ctrl + shift + R


но что ещё необходимо изменить? как минимум, вот здесь, насколько понимаю, нельзя всё так оставить:

Код:
For $i = 1 To $aHK_Vars[0]
    If $aHK_Vars[$i] = "Exit" Then
        _HotKeyAssign($sExit_HT, "_Exit")
    Else
        _HotKeyAssign(Eval("sSwitch" & $aHK_Vars[$i] & "_HT"), "_SwitchTaskBarWindow_Proc", _
            BitOR($HK_FLAG_DEFAULT, $HK_FLAG_EXTENDEDCALL))
    EndIf
Next
#EndRegion Variables & Options
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Alexey [?]
что нужно здесь (ответ #33 данной темы) изменить, чтобы убрать возможность закрывать (по нажатию ctrl + shift + R) работающий скрипт

Код:
$aHK_Vars = StringSplit("Back|Next|DblBack|DblNext|NextBack|BackNext|First|Last|AsAltTab", "|")

For $i = 1 To $aHK_Vars[0]
    _HotKeyAssign(Eval("sSwitch" & $aHK_Vars[$i] & "_HT"), "_SwitchTaskBarWindow_Proc", _
        BitOR($HK_FLAG_DEFAULT, $HK_FLAG_EXTENDEDCALL))
Next


P.S
И не нужно удалять старое сообщение чтобы привлечь внимание, 2 дня это ещё не большой срок, наберись терпения.
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
CreatoR,
благодарю. очень постараюсь больше не делать удалений
я просто счёл это меньшим злом, нежели создание второго подряд сообщения, всё-таки подобным образом форум никак не засоряется

конечно, я бы тихо ждал сколько потребуется, если бы видел хоть какой-то лаконичный отклик типа "займусь через дня 3-4", но суть в том, что было непонятно, дождусь ли я чего-либо вообще
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
хочется, чтобы вместо двух exe-файлов в памяти висел один. если это не сложно и ничем не чревато, прошу подсказать, как правильно объединить скрипт из данной темы и вот отсюда
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Alexey [?]
как правильно объединить скрипт из данной темы и вот отсюда
Код:
;<TaskBar Windows Switcher> program by G.Sandler, v1.1 + SetReadOnly by dwerf
;http://autoit-script.ru/index.php/topic,203.0.html, http://autoit-script.ru/index.php?topic=2585.msg18691#msg18691

#NoTrayIcon
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <GUIToolbar.au3>
#include <WinAPI.au3>
#include <Array.au3>
#include <Misc.au3>
#include <HotKey.au3>

_Singleton("TaskBar_Windows_Switcher")

#Region Variables & Options
Opt("WinWaitDelay", 1)

Global $sLast_NextBack_Window       = ""
Global $sLast_BackNext_Window       = ""        

;При нажатии Alt+F7/F8 вызывается функция _SetReadOnly
HotKeySet('!{F7}', '_SetReadOnly')
HotKeySet('!{F8}', '_SetReadOnly')

Global $sSwitchBack_HT              = 0x0A31 ;ctrl + win + 1
Global $sSwitchNext_HT              = 0x0A32 ;ctrl + win + 2
Global $sSwitchDblBack_HT           = 0x0A38 ;ctrl + win + 8
Global $sSwitchDblNext_HT           = 0x0A39 ;ctrl + win + 9
Global $sSwitchNextBack_HT          = 0x0A33 ;ctrl + win + 3
Global $sSwitchBackNext_HT          = 0x0A37 ;ctrl + win + 7
Global $sSwitchFirst_HT             = 0x0A30 ;ctrl + win + 0
Global $sSwitchLast_HT              = 0x0A35 ;ctrl + win + 5
Global $sSwitchAsAltTab_HT          = 0x0409 ;alt + tab

$aHK_Vars = StringSplit("Back|Next|DblBack|DblNext|NextBack|BackNext|First|Last|AsAltTab", "|")

For $i = 1 To $aHK_Vars[0]
	_HotKeyAssign(Eval("sSwitch" & $aHK_Vars[$i] & "_HT"), "_SwitchTaskBarWindow_Proc", BitOR($HK_FLAG_DEFAULT, $HK_FLAG_EXTENDEDCALL))
Next
#EndRegion Variables & Options

While 1
    Sleep(100)
WEnd

Func _SetReadOnly()
	Local $sPrefix = '-'
	If @HotKeyPressed = '!{F8}' Then $sPrefix = '+'
	
    Local $hActiveWindow = WinGetHandle('[ACTIVE]') ;Получаем handle (идентификатор) активного окна
    Local $sPath = _GetWindowsExplorerPath($hActiveWindow) ;Получаем путь к открытой в этом окне папке (если окно не Explorer'а, а другой программы, получаем ошибку)
    If Not @error Then FileSetAttrib($sPath & '\*', $sPrefix & 'R') ;Если при получении не было ошибок, устанавлеваем аттрибут для файлов лежащих по этому пути
EndFunc

Func _GetWindowsExplorerPath($hWnd)
    Local $pv, $pidl, $return = "", $ret, $hMem, $pid, $folderPath = DllStructCreate("char[260]"), $className
    Local $bPIDL = False
    Local Const $CWM_GETPATH = 0x400 + 12;

    ; Check the classname of the window first
    $className = DllCall("user32.dll", "int", "GetClassName", "hwnd", $hWnd, "str", "", "int", 4096)
    If @error Then Return SetError(2, 0, "")
    If ($className[2] <> "ExploreWClass" And $className[2] <> "CabinetWClass") Then Return SetError(1, 0, "")

    ; Retrieve the process ID for our process
    $pid = DllCall("kernel32.dll", "int", "GetCurrentProcessId")
    If @error Then Return SetError(2, 0, "")

    ; Send the CWM_GETPATH message to the window
    $hMem = DllCall("user32.dll", "lparam", "SendMessage", "hwnd", $hWnd, "int", $CWM_GETPATH, "wparam", $pid[0], "lparam", 0)
    If @error Then Return SetError(2, 0, "")
    If $hMem[0] = 0 Then Return SetError(1, 0, "")

    ; Lock the shared memory
    $pv = DllCall("shell32.dll", "ptr", "SHLockShared", "uint", $hMem[0], "uint", $pid[0])
    If @error Then Return SetError(2, 0, "")
    If $pv[0] Then
        $pidl = DllCall("shell32.dll", "ptr", "ILClone", "uint", $pv[0]) ; Clone the PIDL
        If @error Then Return SetError(2, 0, "")
        $bPIDL = True
        DllCall("shell32.dll", "int", "SHUnlockShared", "uint", $pv) ; Unlock the shared memory
    EndIf
    DllCall("shell32.dll", "int", "SHFreeShared", "uint", $hMem, "uint", $pid) ; Free the shared memory

    If $bPIDL Then
        ; Retrieve the path from the PIDL
        $ret = DllCall("shell32.dll", "int", "SHGetPathFromIDList", "ptr", $pidl[0], "ptr", DllStructGetPtr($folderPath))
        If (@error = 0) And ($ret[0] <> 0) Then $return = DllStructGetData($folderPath, 1) ; Retrieve the value
        DllCall("shell32.dll", "none", "ILFree", "ptr", $pidl[0]) ; Free up the PIDL that we cloned
        Return SetError(0, 0, $return) ; Success
    EndIf

    Return SetError(2, 0, "") ; Failed a WinAPI call
EndFunc

Func _SwitchTaskBarWindow_Proc($iKey)
    Local $HotKeyPressed = "0x" & Hex($iKey, 4)
    _HotKeyAssign($HotKeyPressed)
    
    Local $sActivate_Window = "", $hParent_Active_Wnd = _WinAPI_GetAncestor(WinGetHandle(""), $GA_ROOTOWNER)
    Local $aTaskBarWindows = _WinListTaskBarWindowsEx(Number($HotKeyPressed <> $sSwitchAsAltTab_HT))
    
    If @error Then Return _HotKeyAssign($HotKeyPressed, "_SwitchTaskBarWindow_Proc", BitOR($HK_FLAG_DEFAULT, $HK_FLAG_EXTENDEDCALL))
    
    For $i = 1 To $aTaskBarWindows[0][0]
        If WinActive($aTaskBarWindows[$i][0]) Or $aTaskBarWindows[$i][0] = $hParent_Active_Wnd Then
            Switch $HotKeyPressed
                Case $sSwitchBack_HT, $sSwitchAsAltTab_HT ;Предыдущее окно (1-ое по счёту)
                    If $i = 1 Then $i = $aTaskBarWindows[0][0] + 1
                    $sActivate_Window = $aTaskBarWindows[$i - 1][0]
                Case $sSwitchNext_HT, $sSwitchAsAltTab_HT ;Следующее окно (1-ое по счёту)
                    If $i = $aTaskBarWindows[0][0] Then $i = 0
                    $sActivate_Window = $aTaskBarWindows[$i + 1][0]
                Case $sSwitchDblBack_HT ;Предыдущее окно (2-ое по счёту)
                    If $i = 1 Then $i = $aTaskBarWindows[0][0] + 1
                    If $i = 2 Then $i = $aTaskBarWindows[0][0] + 2
                    $sActivate_Window = $aTaskBarWindows[$i - 2][0]
                Case $sSwitchDblNext_HT ;Следующее окно (2-ое по счёту)
                    If $i = $aTaskBarWindows[0][0] Then $i = 0
                    If $i + 2 <= $aTaskBarWindows[0][0] Then $sActivate_Window = $aTaskBarWindows[$i + 2][0]
                Case $sSwitchNextBack_HT ;Следующее <> Предыдущее окно
                    If $sLast_NextBack_Window <> $aTaskBarWindows[$i][0] Then $sLast_NextBack_Window = ""
                    
                    If $sLast_NextBack_Window = "" Then
                        If $i = $aTaskBarWindows[0][0] Then $i = 0
                        $sActivate_Window = $aTaskBarWindows[$i + 1][0]
                        $sLast_NextBack_Window = $sActivate_Window
                    Else
                        If $i = 1 Then $i = $aTaskBarWindows[0][0] + 1
                        $sActivate_Window = $aTaskBarWindows[$i - 1][0]
                        $sLast_NextBack_Window = ""
                    EndIf
                Case $sSwitchBackNext_HT ;Предыдущее <> Следующее окно
                    If $sLast_BackNext_Window <> $aTaskBarWindows[$i][0] Then $sLast_BackNext_Window = ""
                    
                    If $sLast_BackNext_Window = "" Then
                        If $i = 1 Then $i = $aTaskBarWindows[0][0] + 1
                        $sActivate_Window = $aTaskBarWindows[$i - 1][0]
                        $sLast_BackNext_Window = $sActivate_Window
                    Else
                        If $i = $aTaskBarWindows[0][0] Then $i = 0
                        $sActivate_Window = $aTaskBarWindows[$i + 1][0]
                        $sLast_BackNext_Window = ""
                    EndIf
                Case $sSwitchFirst_HT, $sSwitchLast_HT
                    $sActivate_Window = ""
            EndSwitch
            
            ExitLoop
        EndIf
    Next
    
    ;Не найдены активные окна...
    If $sActivate_Window = "" Then
        Switch $HotKeyPressed
            Case $sSwitchBack_HT, $sSwitchLast_HT
                ;Активируем последнее окно
                $sActivate_Window = $aTaskBarWindows[$aTaskBarWindows[0][0]][0]
            Case Else
                ;Активируем первое окно
                $sActivate_Window = $aTaskBarWindows[1][0]
        EndSwitch
    EndIf
    
    WinActivate($sActivate_Window)
    _HotKeyAssign($HotKeyPressed, "_SwitchTaskBarWindow_Proc", BitOR($HK_FLAG_DEFAULT, $HK_FLAG_EXTENDEDCALL))
EndFunc

Func _WinListTaskBarWindowsEx($iListSort=1)
    Local $hToolbar = ControlGetHandle("[CLASS:Shell_TrayWnd]", "", "ToolbarWindow323")
    If @error Then $hToolbar = ControlGetHandle("[CLASS:Shell_TrayWnd]", "", "ToolbarWindow322")
    If @error Then Return SetError(1, 0, 0)
    
    Local $aWinList = WinList()
    Local $aRet_List[$aWinList[0][0] + 1][2], $iToolbarButtonIndex
    
    For $i = 1 To $aWinList[0][0] Step 1
        If Not BitAND(WinGetState($aWinList[$i][1]), 2) Then ContinueLoop
        
        $iToolbarButtonIndex = _WinAPI_FindToolbarButton($aWinList[$i][1], $hToolbar)
        
        If $iToolbarButtonIndex > 0 Then
            $aRet_List[0][0] += 1
            $aRet_List[$aRet_List[0][0]][0] = $aWinList[$i][1]
            $aRet_List[$aRet_List[0][0]][1] = $iToolbarButtonIndex
        EndIf
    Next
    
    If $aRet_List[0][0] = 0 Then Return SetError(2, 0, 0)
    
    ReDim $aRet_List[$aRet_List[0][0] + 1][2]
    If $iListSort Then _ArraySort($aRet_List, 0, 1, $aRet_List[0][0], 1)
    
    Return $aRet_List
EndFunc

Func _WinAPI_FindWindowEx($hParent, $hChild, $sClass, $sWindow)
    ; must create structs and use ptrs to account for passing a true NULL as classname or window title
    ; simply using "wstr" and "" does NOT work
    Local $sStruct1, $sStruct2
    
    If $sClass = "" Then
        $sClass = 0
    Else
        $sStruct1 = DllStructCreate("wchar[256]")
        DllStructSetData($sStruct1, 1, $sClass)
        $sClass = DllStructGetPtr($sStruct1)
    EndIf
    
    If $sWindow = "" Then
        $sWindow = 0
    Else
        $sStruct2 = DllStructCreate("wchar[256]")
        DllStructSetData($sStruct2, 1, $sWindow)
        $sWindow = DllStructGetPtr($sStruct2)
    EndIf
    
    Local $aRet = DllCall("user32.dll", "hwnd", "FindWindowExW", "hwnd", $hParent, "hwnd", $hChild, "ptr", $sClass, "ptr", $sWindow)
    
    $sStruct1 = 0
    $sStruct2 = 0
    
    Return $aRet[0]
EndFunc

Func _WinAPI_FindToolbarButton($hWnd, $hTB)
    Local $iReturn = -1, $iPID, $hProcess, $sStruct = DllStructCreate("ptr")
    
    ; open process owning toolbar control
    _WinAPI_GetWindowThreadProcessId($hTB, $iPID)
    
    $hProcess = _WinAPI_OpenProcess(0x410, False, $iPID)
    
    If $hProcess Then
        Local $iCount = _GUICtrlToolbar_ButtonCount($hTB)
        
        For $i = 0 To $iCount - 1
            Local $iID = _GUICtrlToolbar_IndexToCommand($hTB, $i)
            
            ; button param is ptr to owner's window handle, stored in target process's memory space
            Local $dwData = _GUICtrlToolbar_GetButtonParam($hTB, $iID)
            
            ; read the window handle from the explorer process
            Local $aRet = DllCall("kernel32.dll", "int", "ReadProcessMemory", "ptr", _
                    $hProcess, "ptr", $dwData, "ptr", DllStructGetPtr($sStruct), "uint", 4, "uint*", 0)
            
            If $aRet[5] Then
                If $hWnd = DllStructGetData($sStruct, 1) Then
                    $iReturn = $i
                    ExitLoop
                EndIf
            EndIf
        Next
        
        _WinAPI_CloseHandle($hProcess)
    EndIf
    
    Return $iReturn
EndFunc

Func _Exit()
    Exit
EndFunc
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
CreatoR,
благодарствую ;) , в том числе и за оперативность. вот так почти на ровном месте и загруженных процессов стало меньше, да и потребление памяти на 7-8 мб снизилось. мелочь, а приятно
 

lexeyn

Новичок
Сообщения
1
Репутация
0
поцоны, оно должно в w7 64b работать?
чото у меня не робит

вообще давно мечтал о подобной фиговине, со времен когда bblean пользовался на w98
там можно было настроить круто что по win left right окна переключались
плюс у меня было по win up down свернуть развернуть все окна
удобно было

потом я на XP перешел , bblean забросил.
и сделал подобие через autohotkey но там криво у меня получилось
только через посылку клавиш alt-tab
(лол про alt-esc только сдесь узнал, оно вроде лучше былобы)

сейчас на w7 64b перешел, и в ней autohotkey както не так работает,
по ходу дела хоткеи винды приоритет над ним имеют, и изза этого все не так


вообщем до сих пор для меня эта тема актуальна , как бы так сделать
чтобы по win left right окна переключались в порядке таскбара
а по win up down все сворачивались разворачивались

а может в в7 както дефолтными средствами такое можно? ы
 

terro

Новичок
Сообщения
4
Репутация
0
Возможно ли реализовать переключение между окнами в таскбаре через левый клик мыши по иконке в левом верхнем углу рабочего стола? Нужно для переключения полноэкранных приложений. Подскажите пожалуйста как это сделать если возможно.
 

Spray

Новичок
Сообщения
17
Репутация
2
Зачем в сценарии функция _WinAPI_FindWindowEx? Она ни разу не вызывается.


Добавлено:
Сообщение автоматически объединено:

Специально для владельцев двух экранов мой вариант переключалки.

Основная фича: по Win + Left происходит перебор окон на левом экране, а по Win + Right — на правом. Таким образом удобно переключаться между двумя окнами, находящимися на разных экранах. Если же, например, при нажатии Win + Left активно левое окно, то активным становится самое нижнее окно левого экрана, будто бы берётся карта с нижней части колоды и кладётся наверх.

Дополнительные фичи:
  • Перебросить активное окно на другой экран: Win + Enter
  • Свернуть активное окно: Win + N
  • Развернуть/востановить активное окно: Win + X

Код:
#NoTrayIcon
;HotKeySet ("{ESC}", "_exit")
;Func _exit ()
;	Exit
;EndFunc
#include <Array.au3> ; для _ArraySearch

Global Const $K_MINIMIZE = "#n" ; свернуть окно
Global Const $K_MAX_REST = "#x" ; развернуть/восстановить окно
Global Const $K_MAX_ALL = "#+n" ; показать все окна

Global Const $K_THROW = "#{ENTER}" ; переместить окно на другой экран

Global Const $K_TO_LEFT = "#{LEFT}" ; взять окно на левом экране
Global Const $K_TO_RIGHT = "#{RIGHT}" ; взять окно на правом экране

HotKeySet ($K_MINIMIZE, "kSetState")
HotKeySet ($K_MAX_REST, "kSetState")
HotKeySet ($K_MAX_ALL, "kSetState")
HotKeySet ($K_THROW, "kPosition")
HotKeySet ($K_TO_LEFT, "kSwitch")
HotKeySet ($K_TO_RIGHT, "kSwitch")

Func kSetState ()
	Switch @HotKeyPressed
		Case $K_MINIMIZE
			WinSetState ("[ACTIVE]", "", @SW_MINIMIZE)
		Case $K_MAX_REST
			Local Const $win = WinGetHandle ("[ACTIVE]")
			Local Const $maximized = BitAND (WinGetState ($win), 32)
			Local Const $visible = BitAND (WinGetState ($win), 2)
			If NOT $visible Then Return
			If $maximized Then
				WinSetState ($win, "", @SW_RESTORE)
			Else
				WinSetState ($win, "", @SW_MAXIMIZE)
			EndIf
		Case $K_MAX_ALL
			Local Const $winList = WinList ("[REGEXPTITLE:.+]") ; отсеиваем всякие системные окна (без заголовка)
			Local $i, $win, $visible, $minimized
			For $i = 1 To $winList [0][0]
				$win = $winList [$i][1]
				$visible = BitAND (WinGetState ($win), 2)
				$minimized = BitAND (WinGetState ($win), 16)
				If $visible AND $minimized Then
					WinSetState ($win, "", @SW_RESTORE)
				EndIf
			Next
	EndSwitch
EndFunc

Func kPosition ()
	Local Const $win = WinGetHandle ("[ACTIVE]")
	If NOT $win Then Return
	Local Const $pos = WinGetPos ($win)
	Local Const $x = $pos [0], $y = $pos [1], $w = $pos [2]
	Local Const $desktop_w = WinGetPos ("Program Manager") [2]
	Local Const $maximized = BitAND (WinGetState ($win), 32)
	Local Const $new_x = $desktop_w - $x - $w
	If $maximized Then WinSetState ($win, "", @SW_RESTORE)
	WinMove ($win, "", $new_x, $y)
	If $maximized Then WinSetState ($win, "", @SW_MAXIMIZE)
EndFunc

Func kSwitch ()
	Local Const $win = WinGetHandle ("[ACTIVE]")
	If NOT $win Then Return
	Local Const $winList = WinList ("[REGEXPTITLE:.+]") ; отсеиваем всякие системные окна (без заголовка)
	Local Const $pos = WinGetPos ($win)
	Local Const $x = $pos [0] + $pos [2]/2
	Local Const $desktop = WinGetHandle ("Program Manager")
	Local Const $desktop_w = WinGetPos ($desktop) [2]
	Local Const $TO_SIDE = False, $TO_BOTTOM = True, $direction = ($x < $desktop_w / 2) == (@HotKeyPressed == $K_TO_LEFT) AND $win <> $desktop
	Local $i, $start, $end, $step ; параметры цикла
	If $direction == $TO_SIDE Then
		$start = 1
		$end = $winList [0][0]
		$step = 1
	Else ; $direction == $TO_BOTTOM
		$start = $winList [0][0] - 1
		$end = _ArraySearch ($winList, $win, 0, 0, 0, 0, 1, 1)
		$step = -1
	EndIf
	Local $_title, $_win, $visible, $minimized, $_pos, $_x, $opposite ; свойства окна из перебора
	For $i = $start To $end Step $step
		$_title = $winList [$i][0]
		$_win = $winList [$i][1]
		$visible = BitAND (WinGetState ($_win), 2)
		$minimized = BitAND (WinGetState ($_win), 16)
		If $visible AND NOT $minimized AND $_title <> "Program Manager" Then
			$_pos = WinGetPos ($_win)
			$_x = $_pos [0] + $_pos [2]/2
			$opposite = ($x < $desktop_w / 2) <> ($_x < $desktop_w / 2) OR $win == $desktop
			If ($direction == $TO_SIDE) == $opposite Then
				WinActivate ($_win)
				ExitLoop
			EndIf
		EndIf
	Next
EndFunc

While 1
	Sleep (100)
WEnd
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
скрипт из этой темы (в виде ехе-файла) перестал работать после того как программа battle.net вызвала bsod 0xc000021a

после перезагрузки системы в ней появились как минимум 3 проблемы:
1) хаотично перемешанное содержимое панели задач (ещё и со сбившимися настройками) приведено в порядок
2) ярлык explorer.scf перестал запускаться, и это решено не было (но были найдены сразу 2 нормальных обходных варианта)
3) а вот со скриптом совсем беда - полностью поломались 8 клавишных сочетаний (там где ctrl+win+цифра):

Код:
Global $sSwitchBack_HT              = 0x0A31 ;ctrl + win + 1
Global $sSwitchNext_HT              = 0x0A32 ;ctrl + win + 2
Global $sSwitchDblBack_HT           = 0x0A38 ;ctrl + win + 8
Global $sSwitchDblNext_HT           = 0x0A39 ;ctrl + win + 9
Global $sSwitchNextBack_HT          = 0x0A33 ;ctrl + win + 3
Global $sSwitchBackNext_HT          = 0x0A37 ;ctrl + win + 7
Global $sSwitchFirst_HT             = 0x0A30 ;ctrl + win + 0
Global $sSwitchLast_HT              = 0x0A35 ;ctrl + win + 5


я заметил, что вроде бы ctrl таки нажимается. поэтому у меня мизерная надежда на то, что можно скрипт вернуть к жизни, заменив в нём все "win" на что-то другое
но не получилось пока полностью разобраться с этими вот 0x0A31, 0x0A32...
понял я только, что 31, 32 - это сами цифры от 0 до 9, а вот ctrl+win - это 0x0A? а, к примеру, ctrl+shift+alt+цифра как выглядеть будет?

к слову, встроенный в скрипт дополнительный функционал (переключение "read only") по-прежнему работает:
Код:
HotKeySet('!{F7}', '_SetReadOnly')
HotKeySet('!{F8}', '_SetReadOnly')

причём я давно его изменил на сочетания win+9 и win+0:
Код:
HotKeySet('#9', '_SetReadOnly')
HotKeySet('#0', '_SetReadOnly')

то есть, получается, здесь с "win" всё в порядке
в общем, надеюсь на помощь, поскольку сейчас при нажатии на любое из 8 сочетаний клавиш переключений между окнами не происходит

добавлено позднее:

- я переустановил программу "windows script 5.7" - не помогло
- другие мои примерно 10 скриптов (auto it, auto hot key) вроде не пострадали
- дело вряд ли именно в клавише "win", поскольку при "HotKeySet" она работает
- при "Global" ctrl точно нажимается, а вот всё сочетание клавиш (например, ctrl+win+0) - нет. ну или по крайней мере это не приводит к переключению окон
- вот эти экспериментальные варианты также не дают результата:
Код:
Global $sSwitchFirst_HT             = 0x0352 ;ctrl + shift + R

Код:
Global $sSwitchFirst_HT             = 0x0235 ;ctrl + 5

есть ли возможность и смысл попробовать в скрипте перенести всё что касается сочетаний "ctrl+win+цифра" с "Global" на "HotKeySet"?

добавлено ещё позднее:
проблема устранена, причина заключалась в отсутствии "shell32.dll" в одном месте в реестре:
[HKEY_CLASSES_ROOT\CLSID\{00021401-0000-0000-C000-000000000046}\InProcServer32]
@="shell32.dll"
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
в эти дни проверяю как работают нужные мне программы на вин-10 (х64), установленной в виртуальной машине
сейчас вот добрался до своих скриптов и с первым же проблема - окна не переключаются

я попробовал перекомпилировать с установленной галочкой "compile for system x64" - не помогло

вот для удобства скрипт (в хр-32 отлично работает)
(скомпилирован в версии 3.3.0.0 с добавлением файлов: HotKey.au3, HotKey_17b.au3, HotKeyInput.au3, vkArray.au3, vkConstants.au3):
Код:
#NoTrayIcon
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <GUIToolbar.au3>
#include <WinAPI.au3>
#include <Array.au3>
#include <Misc.au3>
#include <HotKey.au3>

_Singleton("My Windows Switcher")

#Region Variables & Options
Opt("WinWaitDelay", 1)

Global $sLast_NextBack_Window       = ""
Global $sLast_BackNext_Window       = ""        

;при нажатии win+9/win+0 вызывается функция _SetReadOnly
HotKeySet('#9', '_SetReadOnly')
HotKeySet('#0', '_SetReadOnly')

Global $sSwitchBack_HT              = 0x0A31 ;ctrl + win + 1
Global $sSwitchNext_HT              = 0x0A32 ;ctrl + win + 2
Global $sSwitchDblBack_HT           = 0x0A38 ;ctrl + win + 8
Global $sSwitchDblNext_HT           = 0x0A39 ;ctrl + win + 9
Global $sSwitchNextBack_HT          = 0x0A33 ;ctrl + win + 3
Global $sSwitchBackNext_HT          = 0x0A37 ;ctrl + win + 7
Global $sSwitchFirst_HT             = 0x0A30 ;ctrl + win + 0
Global $sSwitchLast_HT              = 0x0A35 ;ctrl + win + 5
Global $sSwitchAsAltTab_HT          = 0x0409 ;alt + tab

$aHK_Vars = StringSplit("Back|Next|DblBack|DblNext|NextBack|BackNext|First|Last|AsAltTab", "|")

For $i = 1 To $aHK_Vars[0]
    _HotKeyAssign(Eval("sSwitch" & $aHK_Vars[$i] & "_HT"), "_SwitchTaskBarWindow_Proc", BitOR($HK_FLAG_DEFAULT, $HK_FLAG_EXTENDEDCALL))
Next
#EndRegion Variables & Options

While 1
    Sleep(100)
WEnd

Func _SetReadOnly()
    Local $sPrefix = '-'
    If @HotKeyPressed = '#0' Then $sPrefix = '+'
   
    Local $hActiveWindow = WinGetHandle('[ACTIVE]') ;получаем handle (идентификатор) активного окна
    Local $sPath = _GetWindowsExplorerPath($hActiveWindow) ;получаем путь к открытой в этом окне папке (если окно не explorer'а, а другой программы, получаем ошибку)
    If Not @error Then FileSetAttrib($sPath & '\*', $sPrefix & 'R') ;если при получении не было ошибок, устанавливаем атрибут для файлов, лежащих по этому пути
EndFunc

Func _GetWindowsExplorerPath($hWnd)
    Local $pv, $pidl, $return = "", $ret, $hMem, $pid, $folderPath = DllStructCreate("char[260]"), $className
    Local $bPIDL = False
    Local Const $CWM_GETPATH = 0x400 + 12;

    ; check the class-name of the window first
    $className = DllCall("user32.dll", "int", "GetClassName", "hwnd", $hWnd, "str", "", "int", 4096)
    If @error Then Return SetError(2, 0, "")
    If ($className[2] <> "ExploreWClass" And $className[2] <> "CabinetWClass") Then Return SetError(1, 0, "")

    ; retrieve the process ID for our process
    $pid = DllCall("kernel32.dll", "int", "GetCurrentProcessId")
    If @error Then Return SetError(2, 0, "")

    ; send the CWM_GETPATH message to the window
    $hMem = DllCall("user32.dll", "lparam", "SendMessage", "hwnd", $hWnd, "int", $CWM_GETPATH, "wparam", $pid[0], "lparam", 0)
    If @error Then Return SetError(2, 0, "")
    If $hMem[0] = 0 Then Return SetError(1, 0, "")

    ; lock the shared memory
    $pv = DllCall("shell32.dll", "ptr", "SHLockShared", "uint", $hMem[0], "uint", $pid[0])
    If @error Then Return SetError(2, 0, "")
    If $pv[0] Then
        $pidl = DllCall("shell32.dll", "ptr", "ILClone", "uint", $pv[0]) ; clone the PIDL
        If @error Then Return SetError(2, 0, "")
        $bPIDL = True
        DllCall("shell32.dll", "int", "SHUnlockShared", "uint", $pv) ; un-lock the shared memory
    EndIf
    DllCall("shell32.dll", "int", "SHFreeShared", "uint", $hMem, "uint", $pid) ; free the shared memory

    If $bPIDL Then
        ; retrieve the path from the PIDL
        $ret = DllCall("shell32.dll", "int", "SHGetPathFromIDList", "ptr", $pidl[0], "ptr", DllStructGetPtr($folderPath))
        If (@error = 0) And ($ret[0] <> 0) Then $return = DllStructGetData($folderPath, 1) ; retrieve the value
        DllCall("shell32.dll", "none", "ILFree", "ptr", $pidl[0]) ; free up the PIDL that we cloned
        Return SetError(0, 0, $return) ; success
    EndIf

    Return SetError(2, 0, "") ; failed a WinAPI call
EndFunc

Func _SwitchTaskBarWindow_Proc($iKey)
    Local $HotKeyPressed = "0x" & Hex($iKey, 4)
    _HotKeyAssign($HotKeyPressed)
   
    Local $sActivate_Window = "", $hParent_Active_Wnd = _WinAPI_GetAncestor(WinGetHandle(""), $GA_ROOTOWNER)
    Local $aTaskBarWindows = _WinListTaskBarWindowsEx(Number($HotKeyPressed <> $sSwitchAsAltTab_HT))
   
    If @error Then Return _HotKeyAssign($HotKeyPressed, "_SwitchTaskBarWindow_Proc", BitOR($HK_FLAG_DEFAULT, $HK_FLAG_EXTENDEDCALL))
   
    For $i = 1 To $aTaskBarWindows[0][0]
        If WinActive($aTaskBarWindows[$i][0]) Or $aTaskBarWindows[$i][0] = $hParent_Active_Wnd Then
            Switch $HotKeyPressed
                Case $sSwitchBack_HT, $sSwitchAsAltTab_HT ;предыдущее окно (первое по счёту)
                    If $i = 1 Then $i = $aTaskBarWindows[0][0] + 1
                    $sActivate_Window = $aTaskBarWindows[$i - 1][0]
                Case $sSwitchNext_HT, $sSwitchAsAltTab_HT ;следующее окно (первое по счёту)
                    If $i = $aTaskBarWindows[0][0] Then $i = 0
                    $sActivate_Window = $aTaskBarWindows[$i + 1][0]
                Case $sSwitchDblBack_HT ;предыдущее окно (второе по счёту)
                    If $i = 1 Then $i = $aTaskBarWindows[0][0] + 1
                    If $i = 2 Then $i = $aTaskBarWindows[0][0] + 2
                    $sActivate_Window = $aTaskBarWindows[$i - 2][0]
                Case $sSwitchDblNext_HT ;следующее окно (второе по счёту)
                    If $i = $aTaskBarWindows[0][0] Then $i = 0
                    If $i + 2 <= $aTaskBarWindows[0][0] Then $sActivate_Window = $aTaskBarWindows[$i + 2][0]
                Case $sSwitchNextBack_HT ;следующее <> предыдущее окно
                    If $sLast_NextBack_Window <> $aTaskBarWindows[$i][0] Then $sLast_NextBack_Window = ""
                   
                    If $sLast_NextBack_Window = "" Then
                        If $i = $aTaskBarWindows[0][0] Then $i = 0
                        $sActivate_Window = $aTaskBarWindows[$i + 1][0]
                        $sLast_NextBack_Window = $sActivate_Window
                    Else
                        If $i = 1 Then $i = $aTaskBarWindows[0][0] + 1
                        $sActivate_Window = $aTaskBarWindows[$i - 1][0]
                        $sLast_NextBack_Window = ""
                    EndIf
                Case $sSwitchBackNext_HT ;предыдущее <> следующее окно
                    If $sLast_BackNext_Window <> $aTaskBarWindows[$i][0] Then $sLast_BackNext_Window = ""
                   
                    If $sLast_BackNext_Window = "" Then
                        If $i = 1 Then $i = $aTaskBarWindows[0][0] + 1
                        $sActivate_Window = $aTaskBarWindows[$i - 1][0]
                        $sLast_BackNext_Window = $sActivate_Window
                    Else
                        If $i = $aTaskBarWindows[0][0] Then $i = 0
                        $sActivate_Window = $aTaskBarWindows[$i + 1][0]
                        $sLast_BackNext_Window = ""
                    EndIf
                Case $sSwitchFirst_HT, $sSwitchLast_HT
                    $sActivate_Window = ""
            EndSwitch
           
            ExitLoop
        EndIf
    Next
   
    ;не найдены активные Окна...
    If $sActivate_Window = "" Then
        Switch $HotKeyPressed
            Case $sSwitchBack_HT, $sSwitchLast_HT
                ;активируем последнее окно
                $sActivate_Window = $aTaskBarWindows[$aTaskBarWindows[0][0]][0]
            Case Else
                ;активируем первое окно
                $sActivate_Window = $aTaskBarWindows[1][0]
        EndSwitch
    EndIf
   
    WinActivate($sActivate_Window)
    _HotKeyAssign($HotKeyPressed, "_SwitchTaskBarWindow_Proc", BitOR($HK_FLAG_DEFAULT, $HK_FLAG_EXTENDEDCALL))
EndFunc

Func _WinListTaskBarWindowsEx($iListSort=1)
    Local $hToolbar = ControlGetHandle("[CLASS:Shell_TrayWnd]", "", "ToolbarWindow323")
    If @error Then $hToolbar = ControlGetHandle("[CLASS:Shell_TrayWnd]", "", "ToolbarWindow322")
    If @error Then Return SetError(1, 0, 0)
   
    Local $aWinList = WinList()
    Local $aRet_List[$aWinList[0][0] + 1][2], $iToolbarButtonIndex
   
    For $i = 1 To $aWinList[0][0] Step 1
        If Not BitAND(WinGetState($aWinList[$i][1]), 2) Then ContinueLoop
       
        $iToolbarButtonIndex = _WinAPI_FindToolbarButton($aWinList[$i][1], $hToolbar)
       
        If $iToolbarButtonIndex > 0 Then
            $aRet_List[0][0] += 1
            $aRet_List[$aRet_List[0][0]][0] = $aWinList[$i][1]
            $aRet_List[$aRet_List[0][0]][1] = $iToolbarButtonIndex
        EndIf
    Next
   
    If $aRet_List[0][0] = 0 Then Return SetError(2, 0, 0)
   
    ReDim $aRet_List[$aRet_List[0][0] + 1][2]
    If $iListSort Then _ArraySort($aRet_List, 0, 1, $aRet_List[0][0], 1)
   
    Return $aRet_List
EndFunc

Func _WinAPI_FindWindowEx($hParent, $hChild, $sClass, $sWindow)
    ; must create structs and use ptrs to account for passing a true NULL as class-name or window title
    ; simply using "wstr" and "" does NOT work
    Local $sStruct1, $sStruct2
   
    If $sClass = "" Then
        $sClass = 0
    Else
        $sStruct1 = DllStructCreate("wchar[256]")
        DllStructSetData($sStruct1, 1, $sClass)
        $sClass = DllStructGetPtr($sStruct1)
    EndIf
   
    If $sWindow = "" Then
        $sWindow = 0
    Else
        $sStruct2 = DllStructCreate("wchar[256]")
        DllStructSetData($sStruct2, 1, $sWindow)
        $sWindow = DllStructGetPtr($sStruct2)
    EndIf
   
    Local $aRet = DllCall("user32.dll", "hwnd", "FindWindowExW", "hwnd", $hParent, "hwnd", $hChild, "ptr", $sClass, "ptr", $sWindow)
   
    $sStruct1 = 0
    $sStruct2 = 0
   
    Return $aRet[0]
EndFunc

Func _WinAPI_FindToolbarButton($hWnd, $hTB)
    Local $iReturn = -1, $iPID, $hProcess, $sStruct = DllStructCreate("ptr")
   
    ; open process owning tool-bar control
    _WinAPI_GetWindowThreadProcessId($hTB, $iPID)
   
    $hProcess = _WinAPI_OpenProcess(0x410, False, $iPID)
   
    If $hProcess Then
        Local $iCount = _GUICtrlToolbar_ButtonCount($hTB)
       
        For $i = 0 To $iCount - 1
            Local $iID = _GUICtrlToolbar_IndexToCommand($hTB, $i)
           
            ; button param is ptr to owner's window handle, stored in target process's memory space
            Local $dwData = _GUICtrlToolbar_GetButtonParam($hTB, $iID)
           
            ; read the window handle from the explorer process
            Local $aRet = DllCall("kernel32.dll", "int", "ReadProcessMemory", "ptr", _
                    $hProcess, "ptr", $dwData, "ptr", DllStructGetPtr($sStruct), "uint", 4, "uint*", 0)
           
            If $aRet[5] Then
                If $hWnd = DllStructGetData($sStruct, 1) Then
                    $iReturn = $i
                    ExitLoop
                EndIf
            EndIf
        Next
       
        _WinAPI_CloseHandle($hProcess)
    EndIf
   
    Return $iReturn
EndFunc

Func _Exit()
    Exit
EndFunc
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
несколько подходов у меня было в течение года, вот теперь опять пытаюсь не первый час, но никак не удаётся получить переключающий окна скрипт в х64-системе
сейчас пробую xp_pro_x64_with_sp2_vl_X13-41611

- никакие х64-компилирования не помогают
- Aut2exe_x64.exe не помогает
- в "AutoIt Window Info" я разницы не увидел (применительно к панелям задач на системах хр32 и хр64)
(разве что instance отличается - в одном случае 2, в другом 3)

может быть, в строках, содержащих "user32.dll" и "kernel32.dll" требуются изменения?
или дело в чём-то таком?
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
OffTopic:
в рамках проводимой оптимизации и избавления от многих программ пытаюсь также уменьшить количество процессов, постоянно висящих в памяти

из скриптоподобного перенёс всё что смог в 1 процесс
так получается autohotkey-скрипт из нескольких сотен строк, уже заменивший некоторые программы, среди которых:

- keyman (4.28) (потрясающий портабельный клавиатурный помощник, много лет казавшийся мне абсолютно незаменимым)
- comfort keys (неплохой клавиатурный помощник, имеющий несколько плюсов по сравнению с программой keyman)
- wiz-mouse (прокрутка неактивных окон колесом мыши)
- screenshot captor
- pitaschio (заменена частично, позаимствован только такой функционал как "свернуть все окна при двойном клике на панели задач или на рабочем столе")
- clcl (полагаю, это лучший менеджер буфера обмена) (пока заменена частично, продолжаю искать нормальные варианты для полной замены)
- volumouse (на мой взгляд, лидер среди программ для удобнейшего регулирования звука) (правда, с ней пока попытки замены провалились)

по сути, единственное, что осталось - это полезнейший autoit-скрипт из данной темы

в настоящий момент не получается зарегистрироваться на autohotkey-форуме, поэтому попытаюсь приблизиться к решению вопроса здесь, на этом форуме

1) совсем не склонен так думать, но не может ли вдруг по-настоящему помочь вот это?: github.com/nimdahk/AU3toAHK
впрочем, мне пока не удались даже попытки попробовать в деле данный конвертер

2) реально ли подкорректировать весь функционал (вроде как однотипный) autoit-скрипта из данной темы, чтобы получился готовый и так же хорошо работающий autohotkey-скрипт?
3) или проще с самого начала создать autohotkeу-скрипт?
4) возможно ли вообще autohotkeу-средствами этот функционал воссоздать?
 
Верх