| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3949 人关注过本帖, 1 人收藏
标题:Win10输入法“中”“英”切换源码(2023.01.14 支持第三方输入法)代码在二 ...
只看楼主 加入收藏
kangss
Rank: 6Rank: 6
等 级:贵宾
威 望:14
帖 子:218
专家分:464
注 册:2014-6-12
收藏
得分:0 
以下是引用csyx在2023-1-14 12:48:01的发言:


我这是没问题

你的是切换输入法,当切换到ENG键盘布局时,想再按快捷键输入中文可能不太方便了。
我的是切换开关“中”“英”输入法状态。就是输入密码等地方自动切换到“英”,输入品名等需要输入汉字的地方,自动切换到“中”
2个不一样。
2023-01-14 12:59
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:638
专家分:2472
注 册:2018-3-13
收藏
得分:0 
以下是引用kangss在2023-1-14 12:59:00的发言:
你的是切换输入法,当切换到ENG键盘布局时,想再按快捷键输入中文可能不太方便了。
我的是切换开关“中”“英”输入法状态。就是输入密码等地方自动切换到“英”,输入品名等需要输入汉字的地方,自动切换到“中”
2个不一样。

这我知道,在35楼说明了原因
2022.01.14版这种方法在用户的输入法为万能拼音、极点五笔(它们的用户也不在少数)时是不起作用的,这些输入法的 ImmGetOpenStatus(lnHwnd) 永远返回 1,从而无法判断当前中文输入法是处于中文还是英文输入状态,如果仅考虑使用 搜狗、QQ、微软 输入法的用户可以使用此方案

至于切换到 ENG 时快捷键失效,这倒正常,任何线程同一时刻只允许有一个活动键盘布局,激活 ENG 键盘布局后中文键盘就被停用,而 ENG 键盘是不会处理其他键盘布局的快捷键的。

鉴于主要目的是想在进入某文本/密码框时避免用户输入汉字、全角字符等需求,切换中文键盘的快捷键是否有效就不重要了,只要在丢失焦点后能用函数重新激活中文键盘即可,而禁止输入中文或全角字符,且兼容各种输入法就成了首要需求,因此我还是倾向于使用激活 ENG 键盘的方法
我以前的方法是给文本/密码框设置 InputMask 来避免,可总是存在一些脑残/年龄较大的用户,且数量不在少数,一旦按下键盘而屏幕上没有反应,就吵吵软件有问题,远程过去才发现是输入法状态不对,更让人抓狂的是同样一个坑下次还能再掉进去,所以只能采取禁用中文输入法的方式


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


这家伙很懒,啥也没留下
2023-01-14 13:31
nbwww
Rank: 8Rank: 8
等 级:贵宾
威 望:11
帖 子:301
专家分:709
注 册:2021-1-9
收藏
得分:0 
2022.01.14版  微软拼音   搜狗五笔  ENG  三种测试成功
2023-01-14 14:30
kangss
Rank: 6Rank: 6
等 级:贵宾
威 望:14
帖 子:218
专家分:464
注 册:2014-6-12
收藏
得分:0 
以下是引用nbwww在2023-1-14 14:30:29的发言:

2022.01.14版  微软拼音   搜狗五笔  ENG  三种测试成功

是2023.01.14,写错了
2023-01-14 15:00
nbwww
Rank: 8Rank: 8
等 级:贵宾
威 望:11
帖 子:301
专家分:709
注 册:2021-1-9
收藏
得分:0 


[此贴子已经被作者于2023-1-14 15:07编辑过]

2023-01-14 15:05
kangss
Rank: 6Rank: 6
等 级:贵宾
威 望:14
帖 子:218
专家分:464
注 册:2014-6-12
收藏
得分:0 
回复 45楼 nbwww
是我写错导致的,对2022念念不忘,不知不觉又过了一年
2023-01-14 15:26
kangss
Rank: 6Rank: 6
等 级:贵宾
威 望:14
帖 子:218
专家分:464
注 册:2014-6-12
收藏
得分:0 
以下是引用csyx在2023-1-12 20:15:47的发言:

跟踪了一下:
切换到搜狗拼音时,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 切换(很久以前用过的紫光好像也是),其他流行输入法有哪些快捷键就不清楚了


消息模式,需要发送2个“0x0006”“0x0002”,可改变“中”“英”“全角/半角”状态,支持第三方输入法

#DEFINE IMC_SETCONVERSIONMODE        0x0002
#DEFINE IMC_GETSENTENCEMODE            0x0003
#DEFINE IMC_SETSENTENCEMODE            0x0004
#DEFINE IMC_GETOPENSTATUS            0x0005
#DEFINE IMC_SETOPENSTATUS            0x0006
#DEFINE IMC_SETCANDIDATEPOS            0x0008
#DEFINE IMC_SETCOMPOSITIONFONT        0x000A
#DEFINE IMC_SETSTATUSWINDOWPOS        0x0010
#DEFINE IMC_SETCOMPOSITIONWINDOW    0x000C
#DEFINE IMC_GETSTATUSWINDOWPOS        0x000F
#DEFINE IMC_OPENSTATUSWINDOW        0x0022

SendMessage(lnHwnd, WM_IME_CONTROL, IMC_SETOPENSTATUS, 0/1025)
SendMessage(lnHwnd, WM_IME_CONTROL, IMC_SETCONVERSIONMODE, 0/1025)

2023-01-14 16:57
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10527
专家分:42899
注 册:2014-5-20
收藏
得分:0 
可以了解一下TSF,官方参考资料:
https://learn.
2023-01-15 16:21
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10527
专家分:42899
注 册:2014-5-20
收藏(1)
得分:0 
试试这样:
图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
DECLARE long EnumEnabledLayoutOrTip IN input string@,string@,string@,string@,long
DECLARE long InstallLayoutOrTip     IN input string,long
of = CREATEOBJECT("form1")
of.show(1)
RETURN 

DEFINE CLASS form1 as Form
    width=520
    height=280
    AllowOutput=0
    AutoCenter=1
    ADD OBJECT label1 as label WITH left=10,top=10,autosize=1,caption="KLID or TIP profile for string"
    ADD OBJECT idList as listbox WITH left=10,top=30,width=600,height=200,MultiSelect=1
    ADD OBJECT cmd as commandbutton WITH left=10,top=240,width=60,height=24,caption="确定"
    ADD OBJECT label2 as label WITH left=70,top=246,autosize=1,caption="(输入法选择,选定启用的ID,未选的禁用)"
    
    PROCEDURE init
        aCount = EnumEnabledLayoutOrTip(NULL, NULL, NULL, NULL, 0)
        lotp   = REPLICATE(0h00, aCount*584)
        aCount = EnumEnabledLayoutOrTip(NULL, NULL, NULL, @lotp, LEN(lotp))
        j = 1
        FOR i=1 TO aCount
            id = STRCONV(SUBSTR(lotp,j+64,260), 6)
            id = LEFT(id, AT(0h00,id)-1)
            this.idList.AddItem(id)
            j = j + 584
        ENDFOR
        this.idList.ListIndex = 1
    ENDPROC
    
    PROCEDURE Destroy
        FOR i=1 TO thisform.idList.listcount
            InstallLayoutOrTip(STRCONV(thisform.idList.List(i)+0h00,5), 2)
        ENDFOR
    ENDPROC

    PROCEDURE cmd.click
        FOR i=1 TO thisform.idList.listcount
            nFlags = IIF(thisform.idList.Selected(i), 2, 1)
            InstallLayoutOrTip(STRCONV(thisform.idList.List(i)+0h00,5), nFlags)
        ENDFOR
    ENDPROC 
ENDDEFINE

2023-01-17 11:34
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10527
专家分:42899
注 册:2014-5-20
收藏
得分:0 
可以用 SetDefaultLayoutOrTip 切换当前输入法

声明:
DECLARE long SetDefaultLayoutOrTip IN input string,long

代码:
idList = thisform.idList
SetDefaultLayoutOrTip(STRCONV(idList.List(idList.listIndex)+0h00,5), 2)

2023-01-17 20:22
快速回复:Win10输入法“中”“英”切换源码(2023.01.14 支持第三方输入法)代码 ...
数据加载中...
 
   



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

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