标题:Win10输入法“中”“英”切换源码(2023.01.14 支持第三方输入法)代码在二 ...
只看楼主
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:0 
以下是引用nbwww在2023-1-12 19:31:22的发言:
经测试 WIN10  微软拼音   0是乒乓键    1无效

确实,传参数0可实现循环切换,1无效
2023-01-12 19:37
kangss
Rank: 4
等 级:贵宾
威 望:10
帖 子:138
专家分:237
注 册:2014-6-12
得分:0 
以下是引用nbwww在2023-1-12 19:31:22的发言:

经测试 WIN10  微软拼音   0是乒乓键    1无效

这段代码判断都是win10的“中”“英”状态,不是“微软拼音”,是:中文(简体)输入法。

2023-01-12 19:43
kangss
Rank: 4
等 级:贵宾
威 望:10
帖 子:138
专家分:237
注 册:2014-6-12
得分:0 
以下是引用csyx在2023-1-12 19:34:07的发言:
感谢回复!
刚加装了微软拼音输入法(Office2010附带的),? win10输入法(1) 未切换到拼音状态,请问是用法错误还是函数实现原理所限?

代码是针对“中文(简体)输入法”的,没有判断“微软拼音输入法”

2023-01-12 19:46
kangss
Rank: 4
等 级:贵宾
威 望:10
帖 子:138
专家分:237
注 册:2014-6-12
得分:0 
回复 6楼 csyx
此函数在其他 windows 版本是否也可用?

1、VFP自带的函数支持XP
2、win7用版主的代码
3、win10用这个先凑合着
2023-01-12 19:52
kangss
Rank: 4
等 级:贵宾
威 望:10
帖 子:138
专家分:237
注 册:2014-6-12
得分:0 
虚拟键为啥不用 keybd_event?
个人认为 exe 里面有 keybd_event,各种杀毒软件最喜欢拦截,说是木马
SendMessage PostMessage 一般不会
2023-01-12 19:56
kangss
Rank: 4
等 级:贵宾
威 望:10
帖 子:138
专家分:237
注 册:2014-6-12
得分:0 
以下是引用吹水佬在2023-1-12 19:09:53的发言:

对第三方的输入法有效吗?


搜狗输入法自动会根据win10的“中”“英”状态,自动变

这个代码是单键盘布局模式。多键盘布局模式(就是右下角输入法有 2 个输入法状态图标),明天试试看。
2023-01-12 20:05
kangss
Rank: 4
等 级:贵宾
威 望:10
帖 子:138
专家分:237
注 册:2014-6-12
得分:0 
以下是引用csyx在2023-1-12 19:34:07的发言:


感谢回复!
刚加装了微软拼音输入法(Office2010附带的),? win10输入法(1) 未切换到拼音状态,请问是用法错误还是函数实现原理所限?

你这个应该是跟多键盘布局模式(就是右下角输入法有 2 个输入法状态图标)有关
2023-01-12 20:07
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:0 
跟踪了一下:
切换到搜狗拼音时,WM_IME_CONTROL, IMC_GETCONVERSIONMODE 消息可正确返回 中(1)/英(0)
切换到微软拼音时,m._IME状态 始终为 0
看来是微软拼音未实现/不响应此消息

又:------------------------------------------------------
楼主代码中常数定义似乎和网上查到不同,我查到的是这样:
    #DEFINE IMC_GETCONVERSIONMODE        0x0001
    #DEFINE IMC_SETCONVERSIONMODE        0x0002
    #DEFINE IMC_GETOPENSTATUS            0x0005
MSDN 上说这些常数在 imm.h 中,但我查了这个头文件,没有,几个以 IMC_ 开头的第一个就到 0x0007 了

我用网上查到的这个常数试了一下: SendMessage(lnHwnd, 0x283, 1, 0)
无论是切换到搜狗还微软拼音,均能正确返回中/英文状态: 0 或 1025,对咱们来说,基本可认为就是 英 or 中,也就是取状态没问题
实际的消息返回值是一个组合值,可用 vfp 的 bittest 函数测试这些位,例如,搜狗输入法
bit0 - 0(英文)1(非英文),bit3 - 是否全角,bit10 - 是否中文标点
至于微软拼音,惭愧,实在不会用,居然不知道如何输入全角符号和英文标点 ,留给受虐狂用吧,咱是不考虑它了。要做成一个用来替代 IMESTATUS(无参数) 的函数,还需验证更多的常用输入法 。。。。

不过,如果试图用 SendMessage(lnHwnd, 0x283, 2, 0/1025) 来设置中英文状态,则微软拼音成功,搜狗失败
也许搜狗已抛弃 IME,只支持 TSF 了

这样一来,剩下的事情就是选取最合适的设置输入法方式了
楼主的模拟鼠标点击方式适用于搜狗输入法,估计稍加修改也可用于大多数流行的输入法
模拟快捷键的方式暂只测试了搜狗和微软拼音,都没问题
咱也不用其他输入法,只知道搜狗是用 shift 切换(很久以前用过的紫光好像也是),其他流行输入法有哪些快捷键就不清楚了


[此贴子已经被作者于2023-1-13 03:46编辑过]

2023-01-12 20:15
iswith
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:154
专家分:101
注 册:2013-5-14
得分:0 
以下是引用kangss在2023-1-12 19:56:37的发言:

虚拟键为啥不用 keybd_event?
个人认为 exe 里面有 keybd_event,各种杀毒软件最喜欢拦截,说是木马
SendMessage PostMessage 一般不会

keybd_event我就是调不起来,各种杀毒软件又没有提示拦截信息,一头大,找不到原因。。。
2023-01-12 20:22
nbwww
Rank: 6Rank: 6
等 级:贵宾
威 望:10
帖 子:222
专家分:468
注 册:2021-1-9
得分:0 
回复 19楼 iswith
DECLARE Long keybd_event IN user32 long,long,long,long
    keybd_event(16, 0, 0, 0)   &&模拟按下SHIFT
    keybd_event(16,0,2,0)    &&放开SHIFT   

不行吗?
2023-01-12 21:25



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-511101-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.149292 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved