找回密码
 加入
搜索
查看: 8615|回复: 9

[系统综合] 有没有办法让SEND模拟键盘输入不受输入法的影响?

  [复制链接]
发表于 2010-9-15 15:28:22 | 显示全部楼层 |阅读模式
想写个工具  代码及GUI界面已经基本完成
但是还有个问题解决不了  论坛的大大们帮忙看看
就是当ControlSend 模拟键盘输入时如果输入法是中文  就会导致输入出错
求解
发表于 2010-9-17 19:46:19 | 显示全部楼层
自己写的,可做参考,应该比上面的在某些场合更可靠些。

Func _WinIMEselect($sLayoutID = "E0804804", $title = "[ACTIVE]", $xPos_mouseclick = 129, $yPos_mouseclick = 96, $mousekey = "left", $counter = 2)
        ;;说明
        ;;功能描述:鼠标左键点击当前窗口可输入位置(坐标$xPos_mouseclick, $yPos_mouseclick),更改输入法,默认为左键点击129,96位置2次,输入法更改为英文(中文中国)
        ;;参数:$sLayoutID 输入法代码。输入法代码和名称,具体查看注册表:Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Keyboard Layouts]
;~                 当前用户输入法顺序查看注册表:[HKEY_CURRENT_USER\Keyboard Layout\Preload]
        #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[0])
EndFunc   ;==>_WinIMEselect

评分

参与人数 1金钱 +10 贡献 +5 收起 理由
Joo + 10 + 5 非常感谢

查看全部评分

发表于 2010-9-15 15:42:31 | 显示全部楼层
试试调用API函数 PostMessage 发送 WM_CHAR 消息。
 楼主| 发表于 2010-9-15 15:55:33 | 显示全部楼层
回复 2# baikaifang


    能说具体点不  新手来着的
发表于 2010-9-15 18:33:27 | 显示全部楼层
2楼正解,当然你还可以把中文输入法关了
论坛有这方面的贴子
不过好像在win7下不通用
 楼主| 发表于 2010-9-15 19:22:06 | 显示全部楼层
谢谢楼上的朋友  我搜索下
 楼主| 发表于 2010-9-16 10:55:57 | 显示全部楼层
自己顶下  没人帮解答下吗?
发表于 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("[CLASS:Notepad]", '', 10)
$hNote = WinGetHandle("[CLASS:Notepad]")
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[0]
EndFunc
发表于 2010-9-17 20:12:48 | 显示全部楼层
新手不会,下面继续!
 楼主| 发表于 2010-9-19 00:23:49 | 显示全部楼层
感谢大家的支持
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-15 02:30 , Processed in 0.087241 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表