Что нового

Проблема с раскладкой по умолчанию и ControlSend("^c")

konokrad666

Новичок
Сообщения
22
Репутация
0
Скрипт должен копировать текст из внешнего приложения, эмулируя нажатие Ctrl+c. Другие способы извлечь текст из приложения не работают.

Функция выглядит так:
Код:
ControlFocus ( "Внешняя программа", "", "[CLASS:list; INSTANCE:9]" )
ControlSend ( "Внешняя программа", "", "[CLASS:list; INSTANCE:9]", "^c")


Понятно, при любой раскладке кроме английской ControlSend("^c") не срабатывает. По неизвестной мне причине найденные на форуме способы принудительной смены раскладки не работают.

Пробовал:
Код:
#include <WinAPIex.au3>
$hWnd = WinGetHandle("Внешнее приложение", "")
$hWnd1 = WinGetHandle("Наш скрипт", "")
_WinAPI_SetKeyboardLayout($hWnd, 0x0409)
_WinAPI_SetKeyboardLayout($hWnd1, 0x0409)


Код:
$win_handle = WinGetHandle("", "")
_SetKeyboardLayout("00000409", $win_handle)

Func _SetKeyboardLayout($sLayoutID, $hWnd)
    Local $ret = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", $sLayoutID, "int", 0)
    DllCall("user32.dll", "int", "SendMessage", "hwnd", $hWnd, "int", 0x50, "int", 1, "int", $ret[0])
EndFunc


Так же пробовал заменять
Код:
ControlSend("^c") на ControlSend("^{ASC 099}")
- не работает

В чем может быть проблема?
Заранее спасибо за ответ.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
http://autoit-script.ru/autoit3_docs/functions/ControlSend.htm
 
Автор
K

konokrad666

Новичок
Сообщения
22
Репутация
0
Если вы намекаете что синтаксис не соблюден то это не так.
Сама функция выглядит так:

Код:
ControlFocus ( "Внешняя программа", "", "[CLASS:list; INSTANCE:9]" )
ControlSend ( "Внешняя программа", "", "[CLASS:list; INSTANCE:9]", "^c")
 
Автор
K

konokrad666

Новичок
Сообщения
22
Репутация
0
C2H5OH сказал(а):
Теперь понятно, Ок.
Тогда читаем справку
http://autoit-script.ru/autoit3_docs/functions/Send.htm
видели примечание
?

В таблице указано

Не понял, какое примечание?
Больше примечаний с упоминанием "Ctrl+Break" не нашел.

InnI сказал(а):
konokrad666 [?]
эмулируя нажатие Ctrl+c
В большинстве приложений для копирования можно использовать Ctrl+Ins (независимо от раскладки).

В этом приложении не работает :stars:
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
konokrad666
Раз уж вы работаете с активным окном и с контролом в фокусе, попробуйте так
Код:
#include <WinAPISys.au3>
#include <WinAPIvkeysConstants.au3>

ControlFocus("Внешняя программа", "", "[CLASS:list; INSTANCE:9]")

_WinAPI_Keybd_Event($VK_CONTROL, 0)
_WinAPI_Keybd_Event($VK_C, 0)
_WinAPI_Keybd_Event($VK_C, $KEYEVENTF_KEYUP)
_WinAPI_Keybd_Event($VK_CONTROL, $KEYEVENTF_KEYUP)
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
konokrad666 сказал(а):
Понятно, при любой раскладке кроме английской ControlSend("^c") не срабатывает. По неизвестной мне причине найденные на форуме способы принудительной смены раскладки не работают.
А если так?
Код:
Local $aRet = DllCall('user32.dll', 'uint_ptr', 'LoadKeyboardLayoutW', 'wstr', '00000409', 'uint', '0x00000101')

ControlFocus ( "Внешняя программа", "", "[CLASS:list; INSTANCE:9]" )
ControlSend ( "Внешняя программа", "", "[CLASS:list; INSTANCE:9]", "^c")
 
Автор
K

konokrad666

Новичок
Сообщения
22
Репутация
0
alex33 сказал(а):
konokrad666 сказал(а):
Понятно, при любой раскладке кроме английской ControlSend("^c") не срабатывает. По неизвестной мне причине найденные на форуме способы принудительной смены раскладки не работают.
А если так?
Код:
Local $aRet = DllCall('user32.dll', 'uint_ptr', 'LoadKeyboardLayoutW', 'wstr', '00000409', 'uint', '0x00000101')

ControlFocus ( "Внешняя программа", "", "[CLASS:list; INSTANCE:9]" )
ControlSend ( "Внешняя программа", "", "[CLASS:list; INSTANCE:9]", "^c")

работает, спасибо!

InnI сказал(а):
konokrad666
Раз уж вы работаете с активным окном и с контролом в фокусе, попробуйте так
Код:
#include <WinAPISys.au3>
#include <WinAPIvkeysConstants.au3>

ControlFocus("Внешняя программа", "", "[CLASS:list; INSTANCE:9]")

_WinAPI_Keybd_Event($VK_CONTROL, 0)
_WinAPI_Keybd_Event($VK_C, 0)
_WinAPI_Keybd_Event($VK_C, $KEYEVENTF_KEYUP)
_WinAPI_Keybd_Event($VK_CONTROL, $KEYEVENTF_KEYUP)

Этот способ тоже работает, спасибо.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
konokrad666,
Предупреждение За нарушение общих правил (пункт В.2):
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
OK, значит ща поставлю подпись... :smile: :smile:
 
Верх