Что нового

Send - отправка только на английском

Onis123

Новичок
Сообщения
4
Репутация
0
Необходимо написать программу которая бы игнорировала раскладку клавиатуры при использовании функции Send, отправка только английских символов. (При русской раскладке Send('S') отправит Ы). Пишите, по цене договоримся
 
Автор
O

Onis123

Новичок
Сообщения
4
Репутация
0
Необходимо написать программу которая бы игнорировала раскладку клавиатуры при использовании функции Send, отправка только английских символов. (При русской раскладке Send('S') отправит Ы). Готов выплатить вознаграждение за решение задачи. Учитывать расскадку не только рус-англ
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Код:
$hWnd = 0
;$hWnd = WinGetHandle('[REGEXPCLASS:Notepad.*]')
;SendKeepActive($hWnd)
_SendEx('a', 0, $hWnd)

Func _SendEx($sKeys, $iFlag = 0, $hWnd = 0)
	Local Const $WM_INPUTLANGCHANGEREQUEST = 0x50
	Local $aRet = DllCall("user32.dll", "long", "LoadKeyboardLayoutW", "wstr", Hex(0x0409, 8), "int", 0)
	
	If Not @error And $aRet[0] Then
		If $hWnd = 0 Then
			$hWnd = WinGetHandle('[ACTIVE]')
		EndIf
		
		DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, "int", $WM_INPUTLANGCHANGEREQUEST, "int", 1, "int", $aRet[0])
		Return Send($sKeys, $iFlag)
	EndIf
	
	Return SetError(1)
EndFunc


При использовании SendKeepActive, в SendEx нужно передавать указанный в ней параметр $hWnd.
 
Автор
O

Onis123

Новичок
Сообщения
4
Репутация
0
А не подскажите такую вещь, иногда при отправке команд (Send("!^1")) в определенное окно иногда багается шифт. Он зажимается и удерживается зажатым. Возникает редко, но иногда так критично. Подсказали что это косяк в методах автоита если использовать сендмесседж то этого возникать не будет. Можно заказать у вас скрипт отправки сообщений в определенной окно - аналог функции Send("!^1"). Готов оплатить эту услугу, ровно как и предоставленное решение прошлой.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
По идее должен такой трюк сработать:

Код:
Send('!^1')
Send('{SHIFTUP}')
Send('{CTRLUP}')
Send('{ALTUP}')
 
Автор
O

Onis123

Новичок
Сообщения
4
Репутация
0
Да, штука работает, пробывал уже, однако заметно снижается скорость(



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

Заметил недостаток в предложенном решении, при отправки с русской ракладки _SendEx("!+^g") доходит просто g, без !+^ . Не подскажете как исправить?

Нашел решение с зажатием в топике http://autoit-script.ru/index.php?topic=12055.0 + ещё одно https://www.autoitscript.com/forum/topic/161592-sendex-yet-another-alternative-to-the-built-in-send-function/
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Как то так:

Код:
$hWnd = 0
;$hWnd = WinGetHandle('[REGEXPCLASS:Notepad.*]')
;SendKeepActive($hWnd)
_SendEx('!+^g', 0, $hWnd)

Func _SendEx($sKeys, $iFlag = 0, $hWnd = 0)
    Local Const $WM_INPUTLANGCHANGEREQUEST = 0x50
	Local Const $KEYEVENTF_KEYUP = 0x2
	Local Const $VK_SHIFT = 0x10
	Local Const $VK_CONTROL = 0x11
	Local Const $VK_MENU = 0x12
	
	If $hWnd = 0 Then
		$hWnd = WinGetHandle('[ACTIVE]')
	EndIf
	
    Local $aLayout = DllCall("user32.dll", "long", "LoadKeyboardLayoutW", "wstr", Hex(0x0409, 8), "int", 0)
    
    If Not @error And $aLayout[0] Then
		Local $aOld_KL
		Local $hAutoItWnd = WinGetHandle(AutoItWinGetTitle())
		Local $aProcID = DllCall('user32.dll', 'dword', 'GetWindowThreadProcessId', 'hwnd', $hWnd, 'ptr', 0)
		
		If Not @error And $aProcID[0] Then
			$aOld_KL = DllCall('user32.dll', 'handle', 'GetKeyboardLayout', 'dword', $aProcID[0])
		EndIf
		
		;Set keyboard layout for target and internal autoit window
        DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, "int", $WM_INPUTLANGCHANGEREQUEST, "int", 1, "int", $aLayout[0])
        DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hAutoItWnd, "int", $WM_INPUTLANGCHANGEREQUEST, "int", 1, "int", $aLayout[0])
		
		Send($sKeys, $iFlag)
		
		;Release modifier keys
		DllCall('user32.dll', 'none', 'keybd_event', 'byte', $VK_SHIFT, 'byte', 0, 'dword', $KEYEVENTF_KEYUP, 'ulong_ptr', 0)
		DllCall('user32.dll', 'none', 'keybd_event', 'byte', $VK_CONTROL, 'byte', 0, 'dword', $KEYEVENTF_KEYUP, 'ulong_ptr', 0)
		DllCall('user32.dll', 'none', 'keybd_event', 'byte', $VK_MENU, 'byte', 0, 'dword', $KEYEVENTF_KEYUP, 'ulong_ptr', 0)
		
		;Restore keyboard layout
		If IsArray($aOld_KL) Then
			DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, "int", $WM_INPUTLANGCHANGEREQUEST, "int", 1, "int", $aOld_KL[0])
		EndIf
		
        Return SetError(0)
    EndIf
    
    Return SetError(1)
EndFunc


проверял на обычных окнах (Scite, браузер и т.п.).
 
Верх