注册 登录
编程论坛 VFP论坛

EXE运行时如何关闭中文输入法

laowan001 发布于 2023-01-11 11:14, 3432 次点击
执行编译后的exe时,一启动程序,系统就自动切换到中文输入法,手动关闭可以,但在程序中关闭不起作用,不知是何原因,请高手指教
尝试方法:
text.gotfocus里 IMESTATUS(0)或this.imemode=2 均试过,无效

而且,在开发环境中的命令窗口输入IMESTATUS(0)也不起作用

环境VFP9 SP2 WIN10

搜索过坛子里的相关帖子,方法试过无效,不知是哪里的原因
40 回复
#2
kangss2023-01-11 14:31
1、IMESTATUS() 在win7中已经失效了
2、win10的输入法控制方案又发生了变化
目前怎么在win10中控制改变输入法状态,还不清楚
#3
laowan0012023-01-11 15:40
回复 2楼 kangss
感谢回复,看来还需要等高人出手解决一下了
#4
吹水佬2023-01-11 17:36
关闭输入法就无必要吧
可以不要时切换到EN,再要时恢复中文输入法
#5
吹水佬2023-01-11 17:44
IME架构XP后好象就废了,后用的是TSF架构。
#6
kangss2023-01-11 18:44
折腾半天,做了“废品”,因为状态一直获取不到。
模拟鼠标点击输入法切换“中”“英”状态。高手再想办法获取到“中”“英”状态就能用了

这个办法只适合反人类设计的win10输入法。xp、win7没必要这么麻烦

DECLARE INTEGER FindWindow IN user32 STRING,STRING
DECLARE INTEGER FindWindowEx IN user32 INTEGER,INTEGER,STRING,STRING

lnHwnd1=FindWindow("Shell_TrayWnd",0)
lnHwnd2=FindWindowEx(lnHwnd1,0,"TrayNotifyWnd",NULL)
lnHwnd3=FindWindowEx(lnHwnd2,0,"TrayInputIndicatorWClass",NULL)
lnHwnd4=FindWindowEx(lnHwnd3,0,"IMEModeButton",NULL)

#DEFINE WM_MOUSEMOVE             0x0200
#DEFINE WM_NCLBUTTONDOWN        0x00A1
WM_LBUTTONDOWN = 0x0201
WM_LBUTTONUP = 0x0202
MK_LBUTTON = 0x0001
WM_GETTEXT = 0x000D

DECLARE INTEGER PostMessage IN user32 INTEGER,INTEGER,INTEGER,INTEGER
PostMessage (lnHwnd4,WM_LBUTTONDOWN,MK_LBUTTON ,1)      && 按下左键
PostMessage (lnHwnd4,WM_LBUTTONUP,MK_LBUTTON ,1)        && 放开左键


[此贴子已经被作者于2023-1-11 18:47编辑过]

#7
kangss2023-01-11 18:49
回复 4楼 吹水佬
这种方案 api 能实现,也不好用:一旦切换到ENG键盘布局,键盘快捷键切换就失效了。
#8
kangss2023-01-11 18:57
获取“中”“英”状态的垃圾办法:根据 lnHwnd4 获取窗口大小,屏幕截图,根据截图可以判断
垃圾办法不适合应用
#9
kangss2023-01-11 19:02
C# TSF 输入法的获取
https://blog.
#10
iswith2023-01-11 19:11
以下是引用kangss在2023-1-11 14:31:54的发言:

1、IMESTATUS() 在win7中已经失效了
2、win10的输入法控制方案又发生了变化
目前怎么在win10中控制改变输入法状态,还不清楚


确定win7是失效还是你理解这个功能上有误?
#11
kangss2023-01-11 19:19
以下是引用iswith在2023-1-11 19:11:23的发言:



确定win7是失效还是你理解这个功能上有误?


应该是我表述的不准确,我说的是楼主的意思,楼主是想用IMESTATUS()开关输入法,在win10中切换“中”“英”。
#12
nbwww2023-01-11 19:31
#13
nbwww2023-01-11 19:31
VFP的IMESTATUS()适用XP,之后的windows版本可能不适用。
可以试试用WinAPI切换输入法,如:
DECLARE LONG GetKeyboardLayout IN User32 LONG
DECLARE LONG LoadKeyboardLayout IN User32 STRING@, LONG
DECLARE LONG ActivateKeyboardLayout IN User32 LONG,LONG
hLayout = GetKeyboardLayout(0)
?"切换为En输入法"
LoadKeyboardLayout("0x0409", 1) && KLF_ACTIVATE
?"按一键恢复原输入法"
INKEY(0)
ActivateKeyboardLayout(hLayout, 0)
#14
吹水佬2023-01-11 19:38
以下是引用kangss在2023-1-11 18:49:55的发言:

这种方案 api 能实现,也不好用:一旦切换到ENG键盘布局,键盘快捷键切换就失效了。

具体不清楚你要实现什么功能。
“切换输入法”就是用代码自动实现类似手工按键或鼠标点击切换选择输入法的功能。
如果手工切换后也不能满足要求,代码切换结果也一样。
就算删除全部输入法,也总要有个“输入法”,最基本的就是EN输入法,这样也满足不了要求就难搞了。
#15
kangss2023-01-11 19:39
楼主说的是 win10。上述办法,在 win10 中是我在 7 楼说的切换“键盘布局”,不仅仅是“切换输入法”:切换到ENG键盘布局,键盘快捷键切换就失效了

#16
kangss2023-01-11 19:40
回复 14楼 吹水佬
win10自带的输入法,有“中”“英”2种状态。
装了搜狗输入法之后:
切换搜狗的中英输入状态,win10的“中”“英”状态会改变
切换win10的中英输入状态,搜狗的“中”“英”状态也会改变

我猜测:楼主的意思是想在win10中切换“中”“英”状态

[此贴子已经被作者于2023-1-11 19:41编辑过]

#17
吹水佬2023-01-11 19:49
以下是引用kangss在2023-1-11 19:40:03的发言:

我猜测:楼主的意思是想在win10中切换“中”“英”状态

要“中”就LoadKeyboardLayout“中”,要“英”就LoadKeyboardLayout“英”,是吧
#18
laowan0012023-01-12 08:14
以下是引用吹水佬在2023-1-11 17:36:15的发言:

关闭输入法就无必要吧
可以不要时切换到EN,再要时恢复中文输入法

吹版有所不知,我有个程序是专门用来扫描的,程序运行期间不需要键盘输入任何中文,而有的条码里有字母,此时如果输入法为中文的话则会被拦截(系统认为是在输入汉字),有的人(特别是新人)没注意到输入法的问题,认为是程序出错了。故而想自动切换至英文,避免一些麻烦
#19
easyppt2023-01-12 08:34
确实,扫码枪 条码输入 确实需要切换到英文模式,我们在工作中,这样的问题带来的麻烦 反复出现,如果能控制确实是好事。

现在 大部分用户都是使用搜狗输入法,如果能代码 控制 搜索输入法中英文 切换,至少可以解决大部分用户的问题,能代码 获取当前程序的 输入法状态 并控制搜狗的输入法吗


[此贴子已经被作者于2023-1-12 08:38编辑过]

#20
laowan0012023-01-12 09:15
https://bbs.bccn.net/viewthread.php?tid=485814&highlight=%CA%E4%C8%EB%B7%A8
VFP的IMESTATUS()适用XP,之后的windows版本可能不适用。
可以试试用WinAPI切换输入法,如:
DECLARE LONG GetKeyboardLayout IN User32 LONG
DECLARE LONG LoadKeyboardLayout IN User32 STRING@, LONG
DECLARE LONG ActivateKeyboardLayout IN User32 LONG,LONG
hLayout = GetKeyboardLayout(0)
?"切换为En输入法"
LoadKeyboardLayout("0x0409", 1) && KLF_ACTIVATE
?"按一键恢复原输入法"
INKEY(0)
ActivateKeyboardLayout(hLayout, 0)
上面是2018年的帖子,吹版提供的方法,试过了,可以达到目的
有一点不知能否实现,用了上面的方法,第一次右下角键盘位置显示为 ENG ,再点就没有了,等于输入法当前状态看不到了,能否只切换“中”“英”状态?
#21
laowan0012023-01-12 09:33
有可能模拟发送一个按键 <Shift> 吗?
#22
吹水佬2023-01-12 10:40
回复 20楼 laowan001
要切换为En输入法时:LoadKeyboardLayout("0x0409", 1)
不要时恢复之前输入法状态:ActivateKeyboardLayout(hLayout, 0)
这样不可以吗

#23
laowan0012023-01-12 10:44
回复 22楼 吹水佬
程序代码:
DECLARE LONG GetKeyboardLayout IN User32 LONG
DECLARE LONG LoadKeyboardLayout IN User32 STRING@, LONG
DECLARE LONG ActivateKeyboardLayout IN User32 LONG,LONG
hLayout = GetKeyboardLayout(0)

LoadKeyboardLayout("0x0409", 1) && KLF_ACTIVATE


上面是我在form.Activate时执行的

[此贴子已经被作者于2023-1-12 10:45编辑过]

#24
kangss2023-01-12 10:52
以下是引用laowan001在2023-1-12 09:15:56的发言:

https://bbs.bccn.net/viewthread.php?tid=485814&highlight=%CA%E4%C8%EB%B7%A8
VFP的IMESTATUS()适用XP,之后的windows版本可能不适用。
可以试试用WinAPI切换输入法,如:
DECLARE LONG GetKeyboardLayout IN User32 LONG
DECLARE LONG LoadKeyboardLayout IN User32 STRING@, LONG
DECLARE LONG ActivateKeyboardLayout IN User32 LONG,LONG
hLayout = GetKeyboardLayout(0)
?"切换为En输入法"
LoadKeyboardLayout("0x0409", 1) && KLF_ACTIVATE
?"按一键恢复原输入法"
INKEY(0)
ActivateKeyboardLayout(hLayout, 0)
上面是2018年的帖子,吹版提供的方法,试过了,可以达到目的
有一点不知能否实现,用了上面的方法,第一次右下角键盘位置显示为 ENG ,再点就没有了,等于输入法当前状态看不到了,能否只切换“中”“英”状态?


你这就是我在 7 楼说的“副作用”:一旦切换到ENG键盘布局,键盘快捷键切换就失效了
你表达的意思我猜对了,因为你想实现的功能,我一直在用。版主的方案是win7方案。
“LoadKeyboardLayout”不是切换输入法,是切换“键盘布局”。
如果你没有主动添加“ENG”,“ENG键盘布局”想要删除,还得安装布局才能删除。

你的想法,我早都知道 win10 下不好处理,昨天看到你问了,就搞了一下,我 6 楼的代码就是你想要的切换“中”“英”状态,遗憾的是:没法判断它的状态。
#25
kangss2023-01-12 11:03
以下是引用easyppt在2023-1-12 08:34:37的发言:

确实,扫码枪 条码输入 确实需要切换到英文模式,我们在工作中,这样的问题带来的麻烦 反复出现,如果能控制确实是好事。

现在 大部分用户都是使用搜狗输入法,如果能代码 控制 搜索输入法中英文 切换,至少可以解决大部分用户的问题,能代码 获取当前程序的 输入法状态 并控制搜狗的输入法吗

只有本站会员才能查看附件,请 登录
#26
laowan0012023-01-12 11:04
回复 24楼 kangss
感谢感谢,我试试
#27
kangss2023-01-12 11:08
回复 26楼 laowan001
我猜你的意图没错吧?只是目前还没有找到获取“中”“英”状态的办法
#28
吹水佬2023-01-12 14:52
是不是把问题复杂化了,系统的键盘鼠标干预太多也不好。
获取数据后不可以判断出是否有效吗?
#29
吹水佬2023-01-12 15:03
确是暂时不用中文输入,可暂时卸载中文输入,到时再载入,就看用户会不会去系统设置里添加回去了,否则还真是复杂到无地自容。
#30
kangss2023-01-12 16:10
找到判断“中”“英”状态的办法了:https://blog.

isEnglishMode(){
    hWnd := winGetID("A")
    result := SendMessage(
        0x283, ; Message : WM_IME_CONTROL
        0x001, ; wParam : IMC_GETCONVERSIONMODE
        0, ; lParam : (NoArgs)
        , ; Control : (Window)
        ; 获取当前输入法的模式
        ; Retrieves the default window handle to the IME class.
        "ahk_id " DllCall("imm32\ImmGetDefaultIMEWnd", "Uint", hWnd, "Uint")
    )
    ; DetectHiddenWindows Fasle
    ; 返回值是0表示是英文模式,其他值表明是中文模式
    return result == 0
}
#31
kangss2023-01-12 17:51
ls3:判断“中”“英”状态
ls1:改变“中”“英”状态
测试成功,随后再整理
只有本站会员才能查看附件,请 登录
#32
csyx2023-01-12 18:40
以下是引用kangss在2023-1-12 17:51:56的发言:
ls3:判断“中”“英”状态
ls1:改变“中”“英”状态
测试成功,随后再整理

虽暂时用不上,期待英雄放出测试代码学习下
#33
kangss2023-01-12 18:44
回复 楼主 laowan001
Win10输入法“中”“英”切换源码
https://bbs.bccn.net/thread-511101-1-1.html
#34
kangss2023-01-12 18:44
回复 32楼 csyx
Win10输入法“中”“英”切换源码:https://bbs.bccn.net/thread-511101-1-1.html
#35
吹水佬2023-01-17 17:47
回复 楼主 laowan001
试试这个贴的49楼代码,启用或禁用选择的输入法。
https://bbs.bccn.net/thread-511101-5-1.html
#36
laowan0012023-01-17 17:57
回复 33楼 kangss
谢谢
#37
独木星空2023-01-17 22:09
对于除与解决素数有关的问题外,其他方面很少涉猎,因为,没有时间和精力。
#38
吹水佬2023-01-18 08:19
以下是引用独木星空在2023-1-17 22:09:06的发言:

对于除与解决素数有关的问题外,其他方面很少涉猎,因为,没有时间和精力。

用PC解决素数有关的问题,也只能局限于很有限的验证。
“素数”问题是纯数论的问题,从论证法测看PC是解决不了,只能有限的“必要性”,体验不了“充分性”。
确要用PC玩素数,因要处理大量数据,用VFP不太适合。
还记得早前那个创建素数表的事情吗,用VFP效率太低,给了个C写的DLL测试,明显VFP就差太多。
VFP处理数据量也很有限,VFP最大也只能处理32bit整数数据类型。
也许会问,可以用大数方法来突破32bit,那就更差劲了,大数方法实质是字符串处理,算法也变复杂,VFP处理大字符串的效率低。



[此贴子已经被作者于2023-1-18 10:26编辑过]

#39
独木星空2023-01-18 20:49
回复 38楼 吹水佬
多谢!吹水佬版主给提供的dll素数制作文件。
我只需要小部分实际数据,大多情况下,vfp还是可以适应的。
有一种新的算法,单位矩阵与周期矩阵乘法,可以大大降低运算量及储存数据量。对超过有效位数字的一般情况下还涉及不到。
作为验证或检验,还是满可以的。
#40
吹水佬2023-01-23 12:30
以下是引用kangss在2023-1-11 18:49:55的发言:

这种方案 api 能实现,也不好用:一旦切换到ENG键盘布局,键盘快捷键切换就失效了。

键盘快捷键应该可以重新定义
#41
吹水佬2023-01-23 13:04
以下是引用laowan001在2023-1-12 09:15:56的发言:

https://bbs.bccn.net/viewthread.php?tid=485814&highlight=%CA%E4%C8%EB%B7%A8
VFP的IMESTATUS()适用XP,之后的windows版本可能不适用。
可以试试用WinAPI切换输入法,如:
DECLARE LONG GetKeyboardLayout IN User32 LONG
DECLARE LONG LoadKeyboardLayout IN User32 STRING@, LONG
DECLARE LONG ActivateKeyboardLayout IN User32 LONG,LONG
hLayout = GetKeyboardLayout(0)
?"切换为En输入法"
LoadKeyboardLayout("0x0409", 1) && KLF_ACTIVATE
?"按一键恢复原输入法"
INKEY(0)
ActivateKeyboardLayout(hLayout, 0)
上面是2018年的帖子,吹版提供的方法,试过了,可以达到目的
有一点不知能否实现,用了上面的方法,第一次右下角键盘位置显示为 ENG ,再点就没有了,等于输入法当前状态看不到了,能否只切换“中”“英”状态?

由于不同的输入法键盘布局不同,输入法切换“中”“英”状态模式也有可能不同。
IME提供的一套状态模式标志只适用于windows系统的输入法,对于第三方输入法要确保兼容就很难说。
要完全适用第三方输入法,也只能按目前版本逐个测试,从而获取状态模式标志,看看有无搞头了。

在win10环境测试用“多多”输入法设计软件创建的五笔输入法,用Shift切换中英状态,IME的状态模式有变化(但不符合原标志含意),但用Ctrl+Space切换中英状态,IME的状态模式没有变化,IME的可靠性有待进一步测试。

话又说回来,既然有得中英切换,程序自动切换后,用户还是有可能无意手动Shift或Ctrl+Space。
1