kisyan 发表于 2010-9-15 15:28:22

有没有办法让SEND模拟键盘输入不受输入法的影响?

想写个工具代码及GUI界面已经基本完成
但是还有个问题解决不了论坛的大大们帮忙看看
就是当ControlSend 模拟键盘输入时如果输入法是中文就会导致输入出错
求解

ghl781258 发表于 2010-9-17 19:46:19

自己写的,可做参考,应该比上面的在某些场合更可靠些。

Func _WinIMEselect($sLayoutID = "E0804804", $title = "", $xPos_mouseclick = 129, $yPos_mouseclick = 96, $mousekey = "left", $counter = 2)
        ;;说明
        ;;功能描述:鼠标左键点击当前窗口可输入位置(坐标$xPos_mouseclick, $yPos_mouseclick),更改输入法,默认为左键点击129,96位置2次,输入法更改为英文(中文中国)
        ;;参数:$sLayoutID 输入法代码。输入法代码和名称,具体查看注册表:Windows Registry Editor Version 5.00
;~                 当前用户输入法顺序查看注册表:
        #CS 常见输入法代码
                00000409 - 英文输入法
                E0040804 - 智能ABC输入法
                E0010804 - 全拼输入法
                E0100804 - 王码五笔型输入法86版
                E0200804 - 极品五笔输入法
                E0200804 - 搜狗拼音输入法
                E0220804 - 万能五笔输入法
                E00E0804 - 微软拼音输入法
                E0020804 - 双拼输入法
                E0050804 - 区位码输入法
                E0030804 - 郑码输入法
        #CE
;~         $title 窗口标题,默认当前活动窗口
;~ $xPos_mouseclick 鼠标点击x坐标,默认值129
;~ $yPos_mouseclick 鼠标点击y坐标,默认值96
;~ $mousekey 鼠标键,默认左键"left"
;~ $counter 鼠标点击数,默认点击2次
        MouseClick($mousekey, $xPos_mouseclick, $yPos_mouseclick, $counter)
        $hWnd = WinGetHandle($title)
        Local $WM_INPUTLANGCHANGEREQUEST = 0x50
        Local $ret = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", $sLayoutID, "int", 1 + 0)
        DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, "int", $WM_INPUTLANGCHANGEREQUEST, "int", 1, "int", $ret)
EndFunc   ;==>_WinIMEselect

baikaifang 发表于 2010-9-15 15:42:31

试试调用API函数 PostMessage 发送 WM_CHAR 消息。

kisyan 发表于 2010-9-15 15:55:33

回复 2# baikaifang


    能说具体点不新手来着的

xyold1 发表于 2010-9-15 18:33:27

2楼正解,当然你还可以把中文输入法关了
论坛有这方面的贴子
不过好像在win7下不通用

kisyan 发表于 2010-9-15 19:22:06

谢谢楼上的朋友我搜索下

kisyan 发表于 2010-9-16 10:55:57

自己顶下没人帮解答下吗?

baikaifang 发表于 2010-9-17 13:57:08

给你个示例代码Dim Const $WM_CHAR = 0x102
Dim Enum $VK_A = 0x41, $VK_B, $VK_C, $VK_D, $VK_E
Dim $hNote, $hEdit, $aRet

Run('notepad.exe')
Opt('WinTitleMatchMode', 4)
WinWait("", '', 10)
$hNote = WinGetHandle("")
Opt('WinTitleMatchMode', 1)
$hEdit = ControlGetHandle($hNote, '', 'Edit1')

_WinAPI_PostMessage($hEdit, $WM_CHAR, $VK_A, 0)
_WinAPI_PostMessage($hEdit, $WM_CHAR, $VK_B, 0)
_WinAPI_PostMessage($hEdit, $WM_CHAR, $VK_C, 0)
_WinAPI_PostMessage($hEdit, $WM_CHAR, $VK_D, 0)
_WinAPI_PostMessage($hEdit, $WM_CHAR, $VK_E, 0)


Func _WinAPI_PostMessage($hWnd, $iMsg, $iwParam, $ilParam)
        Local $aResult = DllCall("user32.dll", "bool", "PostMessage", "hwnd", $hWnd, "uint", $iMsg, "wparam", $iwParam, "lparam", $ilParam)
        If @error Then Return SetError(@error, @extended, False)
        Return $aResult
EndFunc

转角遇到囜 发表于 2010-9-17 20:12:48

新手不会,下面继续!

kisyan 发表于 2010-9-19 00:23:49

感谢大家的支持
页: [1]
查看完整版本: 有没有办法让SEND模拟键盘输入不受输入法的影响?