Что нового

Переключится на предыдущее активное окно, альтернатива Alt + ESC

reset86

Новичок
Сообщения
47
Репутация
0
У меня это реализовано вот таким способом, как в примере, я использую горячие клавиши Windows Alt + ESC, это рабочий способ. Но есть программа, Notepad2, если использовать программу с ней, то происходит залипание клавиш Alt и ESC, задержки между нажатиями и отжатиями, в любом месте не помогают, повторное нажатие Alt и ESC, через программу не помогает, отлипают только при физическом нажатии на клавиатуре этих клавиш. Боюсь, что данная проблема может проявляться не только в Notepad2. Если использовать Send, то происходит тоже самое.

Может есть какой то альтернативный способ "Alt + ESC".

Код:
; Я выделил текст в окне сторонней программе, любой.
; Запускаю программу или нажимаю кнопку в программе и запускаю данную функцию, неважно, это пример.
#include <WinAPIEx.au3> 
_WinAPI_Keybd_Event(0x12, 0)
_WinAPI_Keybd_Event(0x1B, 0)
_WinAPI_Keybd_Event(0x1B, 2)
_WinAPI_Keybd_Event(0x12, 2)  ; Программа переключается обратно на то окно, в котором был выделен текст.

;--------------------

_WinAPI_Keybd_Event(0x11, 0)
_WinAPI_Keybd_Event(0x43, 0)
_WinAPI_Keybd_Event(0x43, 2)
_WinAPI_Keybd_Event(0x11, 2)  ; И заносит текст в буфер обмена (Ctrl + C).

Sleep(100)  ; Далее выполняется нужная мне операция с текстом из буфера.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
reset86
Вы немного путаете. Между последними активными окнами переключает Alt+TAB при разовом нажатии. Alt+ESC переключает окна по цепочке z-последовательности, также, как Alt+TAB при зажатом Alt.

Вы можете "повесить" вызов функции на горячую клавишу, тогда не придётся активировать окно скрипта для нажатия кнопки.
Также можно перечислить окна через WinList (см. пример в справке). Эта функция как раз создаёт z-последовательность и предыдущее активное окно будет следующим после текущего активного. И можно будет его активировать через WinActivate.
 
Автор
reset86

reset86

Новичок
Сообщения
47
Репутация
0
Alt+TAB не подходит, не работает, так как надо, переключает не то, да и не красиво, мельтешит.
Программа работает таким образом, как в схеме, так что возможно, что тема не совсем корректно названа.
В одну программу слепить нельзя, из за однопоточности autoit, gui будет висеть до завершения запущенной функции, а так, функция находится в отдельной скрытой программе и запускается как фоновый процесс, который при необходимости, закрывается через ProcessClose, при нажатии кнопки в GUI.
Программа рабочая и уже написанная, работает почти во всех окнах, кроме Notepad2, вчера увидел и очень расстроился, боюсь, что это не единственная программа, где может это проявится, хотя в том же notepad++ все работает корректно. Попробую WinList.


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

Сделал на WinList. Но в Notepad2, все равно не работает, хорошо хоть клавиши не залипают, в любом случае так лучше.

Код:
#include <WinAPIEx.au3> 
; -----------------------
$aList = WinList()
Global $xDesc, $xConsole
$x = 0
For $i = 1 To $aList[0][0]
If $aList[$i][0] <> "" And BitAND(WinGetState($aList[$i][1]), 2) Then
$x = $x + 1
If $x = 1 Then
$xConsole = "Дескриптор=" & $aList[$i][1] & "   Заголовок=" & $aList[$i][0] ; Для отладки
$xDesc = $aList[$i][1]
EndIf
EndIf
Next
WinActivate ($xDesc)
ConsoleWrite($xConsole & @CRLF)  ; Для отладки 
; -----------------------
_WinAPI_Keybd_Event(0x11, 0)
_WinAPI_Keybd_Event(0x43, 0)
_WinAPI_Keybd_Event(0x43, 2)
_WinAPI_Keybd_Event(0x11, 2)
Sleep(100)  ; Далее выполняется нужная мне операция с текстом из буфера.
 

Вложения

  • 1.png
    1.png
    14.9 КБ · Просмотры: 10

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
reset86
Скачал Notepad2 4.2.25. Запустил скрипт
Код:
GUICreate("")
$btn = GUICtrlCreateButton("   test   ", 10, 10)
GUISetState()

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $btn
      Run("test.exe")
  EndSwitch
Until 0
Перешёл в окно Notepad2, выделил текст, перешёл в окно GUI, нажал кнопку. Активировался Notepad2 и текст скопировался. Ничего не залипло (Win7 x86, AutoIt 3.3.14.2). Содержимое test.exe
Код:
Send("!{esc}")
Send("^{ins}")
 
Автор
reset86

reset86

Новичок
Сообщения
47
Репутация
0
А у меня залипают, Notepad2 тот же. Переключение через WinList, в любом случае более правильнее.
 
Верх