标题:Win10输入法“中”“英”切换源码(2023.01.14 支持第三方输入法)代码在二 ...
只看楼主
kangss
Rank: 4
等 级:贵宾
威 望:10
帖 子:138
专家分:237
注 册:2014-6-12
结帖率:100%
已结贴  问题点数:20 回复次数:55 
Win10输入法“中”“英”切换源码(2023.01.14 支持第三方输入法)代码在二楼


代码思路:https://bbs.bccn.net/thread-511088-1-1.html

多键盘布局模式:2个输入法图标


【2023.01.14 支持第三方输入法 代码在二楼】

程序代码:
*****************************************************
* win10输入法([color=#800000]1) &&打开输入法[/color]
* win10输入法([color=#800000]0) &&关闭输入法[/color]
* VFP自身的IMESTATUS([color=#800000]0)对win7有毛病,不支持[/color]
* win10 IME 改为 TFS 模式
* [color=#800000]2023.01.13 增加多键盘布局模式(2个输入法图标)[/color]
*****************************************************
PARAMETERS m._Mode

AGETFILEVERSION(aFile, "ntdll.dll")

IF VAL(aFile(4)) >= 10            && VFP自身的“OS()”在win10中也失灵了
    ******************
    * 判断“中”“英”
    ******************
    *!*    #include <iostream>
    *!*    #include <Windows.h>
    *!*    #pragma comment (lib, "imm32.lib")
    *!*    #define IMC_GETOPENSTATUS 0x0005
    *!*    using namespace std;

    *!*    int main() {
    *!*        while (true) {
    *!*            HWND hIME = ImmGetDefaultIMEWnd(GetForegroundWindow());
    *!*            LRESULT status = SendMessage(hIME, WM_IME_CONTROL, IMC_GETOPENSTATUS, 0);
    *!*            cout << (status ? "Korean" : "English") << endl;
    *!*            Sleep(100);
    *!*        }
    *!*        return 0;
    *!*    }
    #DEFINE WM_IME_CONTROL                0x283
    #DEFINE IMC_GETCONVERSIONMODE        0x0005

    LOCAL m.lnHwnd, m._IME状态    && 0:“英”,否则是“中”或其它

    IF win10鼠标点击切换中英(0) > 1
        DECLARE INTEGER ImmGetContext IN imm32.DLL LONG
        */* DECLARE INTEGER ImmGetOpenStatus IN imm32.DLL LONG
        DECLARE INTEGER ImmSetConversionStatus IN imm32.DLL LONG,LONG iMode,LONG iSentence

        m.lnHwnd = ImmGetContext(_VFP.HWND)
        */* m._IME状态 = ImmGetOpenStatus(m._m)
        */* ? IIF(m._IME状态 = 0, "英", "中")
        *!*    中文输入-半角-中文符号    1025
        *!*    中文输入-全角-中文符号    1033
        *!*    中文输入-半角-英文符号    1
        *!*    中文输入-全角-英文符号    9
        *!*    英文输入-半角-中文符号    1024
        *!*    英文输入-全角-中文符号    1032
        *!*    英文输入-半角-英文符号    0
        *!*    英文输入-全角-英文符号    8

        ImmSetConversionStatus(m.lnHwnd, IIF(m._mode = 1,1025, 0), 8)

        CLEAR DLLS ImmSetConversionStatus, ImmGetContext
        RETURN
    ENDIF

    DECLARE INTEGER ImmGetDefaultIMEWnd IN Imm32 LONG
    */* DECLARE INTEGER SendMessage IN WIN32API AS "ls_SendMessage" LONG HWND, LONG Msg, LONG wParam, INTEGER
    */* lnHwnd = ImmGetDefaultIMEWnd(_VFP.HWND)        && 输入法会给每个窗口发消息
    */* m._IME状态 =  ls_SendMessage(lnHwnd, WM_IME_CONTROL, IMC_GETCONVERSIONMODE, 0)    && m.lcText:任务栏输入指示

    DECLARE INTEGER ImmGetContext IN imm32.DLL LONG
    lnHwnd  = ImmGetContext(_VFP.HWND)
    m._IME状态 = ImmGetOpenStatus(lnHwnd)
    ******************

    IF m._Mode = 0        && 置“英”
        IF m._IME状态 != 0
            win10鼠标点击切换中英()
        ENDIF
    ELSE                && 置“中”
        IF m._IME状态 = 0
            win10鼠标点击切换中英()
        ENDIF
    ENDIF

    CLEAR DLLS "ImmGetDefaultIMEWnd", "ls_SendMessage"
    RETURN
ENDIF

FUNCTION win10鼠标点击切换中英(m._ime_num)
    DECLARE INTEGER FindWindow IN user32 AS "ls_FindWindow" STRING, STRING
    DECLARE INTEGER FindWindowEx IN user32 AS "ls_FindWindowEx" INTEGER, INTEGER, STRING, STRING
    DECLARE INTEGER PostMessage IN user32 AS "ls_PostMessage" INTEGER, INTEGER, INTEGER, INTEGER

    LOCAL m.lnHwnd1, lnHwnd2, m.lnHwnd3, m.lnHwnd4, m.lnHwnd5
    m.lnHwnd1 = ls_FindWindow("Shell_TrayWnd", 0)
    m.lnHwnd2 = ls_FindWindowEx(m.lnHwnd1, 0, "TrayNotifyWnd", NULL)
    m.lnHwnd3 = ls_FindWindowEx(m.lnHwnd2, 0, "TrayInputIndicatorWClass", NULL)
    m.lnHwnd4 = ls_FindWindowEx(m.lnHwnd3, 0, "IMEModeButton", NULL)
    m.lnHwnd5 = ls_FindWindowEx(m.lnHwnd3, 0, "InputIndicatorButton", NULL)    &&

    ************************
    * 检查单键盘、双键盘布局
    ************************
    IF TYPE("_ime_num") = "N"
        LOCAL m._IME布局1, lpRect1, lnWidth1, m._IME布局2, lpRect2, lnWidth2
        lpRect1 = REPLI(CHR(0), 16)
        lpRect2 = REPLI(CHR(0), 16)
        DECLARE SHORT GetWindowRect IN user32 INTEGER HWND, STRING @ lpRect
        GetWindowRect (lnHwnd4, @lpRect1)
        lnWidth1 = CTOB(SUBS(lpRect1,9,4),'4rs') - CTOB(SUBS(lpRect1,1,4),'4rs')
        GetWindowRect (lnHwnd4, @lpRect2)
        lnWidth2 = CTOB(SUBS(lpRect1,9,4),'4rs') - CTOB(SUBS(lpRect2,1,4),'4rs')

        CLEAR DLLS "ls_FindWindow", "ls_FindWindowEx", "ls_PostMessage"

        IF lnWidth1 > 0 AND lnWidth2 > 0
            m._ime_num = 2
        ELSE
            m._ime_num = 1
        ENDIF

        RETURN m._ime_num
    ENDIF
    ************************

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

    ls_PostMessage(m.lnHwnd4, WM_LBUTTONDOWN, MK_LBUTTON, 1)        && 按下左键
    ls_PostMessage(m.lnHwnd4, WM_LBUTTONUP, MK_LBUTTON, 1)        && 放开左键

    CLEAR DLLS "ls_FindWindow", "ls_FindWindowEx", "ls_PostMessage"
ENDFUNC



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

搜索更多相关主题的帖子: Win10 输入法 INTEGER 输入 LONG 
2023-01-12 18:43
kangss
Rank: 4
等 级:贵宾
威 望:10
帖 子:138
专家分:237
注 册:2014-6-12
得分:0 


*!*    中文输入-半角-中文符号    1025                *!*    中文输入-全角-中文符号    1033
*!*    中文输入-半角-英文符号    1                    *!*    中文输入-全角-英文符号    9
*!*    英文输入-半角-中文符号    1024                *!*    英文输入-全角-中文符号    1032
*!*    英文输入-半角-英文符号    0                    *!*    英文输入-全角-英文符号    8
也可以通过发消息“1033”“1032”改变全角半角状态

程序代码:
*****************************************************
* win10输入法([color=#800000]1) &&打开输入法[/color]
* win10输入法([color=#800000]0) &&关闭输入法[/color]
* VFP自身的IMESTATUS([color=#800000]0)对win7有毛病,不支持[/color]
* win10 IME 改为 TFS 模式
* [color=#800000]2023.01.13 增加多键盘布局模式(2个输入法图标)[/color]
* [color=#800000]2023.01.14 取消判断多键盘布局,支持第三方输入法[/color]
*****************************************************
PARAMETERS m._Mode

AGETFILEVERSION(aFile, "ntdll.dll")

IF VAL(aFile(4)) >= 10            && VFP自身的“OS()”在win10中也失灵了
    IF win10鼠标点击切换中英(0) <> m._Mode
        win10鼠标点击切换中英(1)
    ENDIF

    RETURN
ENDIF

FUNCTION win10鼠标点击切换中英(m._ime_num)
    m._ime_num = EVL(m._ime_num, 0)

    DECLARE INTEGER SendMessage IN user32 AS "ls_SendMessage" LONG HWND, LONG Msg, LONG wParam, INTEGER

    ******************
    * 判断“中”“英”
    ******************
    IF m._ime_num = 0
        #DEFINE WM_IME_CONTROL                0x283
        #DEFINE IMC_GETCONVERSIONMODE        0x0005
        #DEFINE KLF_ACTIVATE                0x00000001
        #DEFINE KLF_SETFORPROCESS            0x00000100

        DECLARE INTEGER ImmGetDefaultIMEWnd IN Imm32 LONG
        DECLARE LONG LoadKeyboardLayout IN User32 STRING@, LONG
        DECLARE LONG ActivateKeyboardLayout IN User32 LONG,LONG

        m.lnHwnd0 = ImmGetDefaultIMEWnd(_VFP.HWND)

        hLayout = LoadKeyboardLayout("00000804", 1)            && 切换为中文输入法
        ActivateKeyboardLayout(hLayout, KLF_SETFORPROCESS)

        LOCAL m._请求
        m._请求 = ls_SendMessage(m.lnHwnd0, WM_IME_CONTROL, 1, 1)

        */* ? IIF(m._IME状态 = 0, "英", "中")
        *!*    中文输入-半角-中文符号    1025                *!*    中文输入-全角-中文符号    1033
        *!*    中文输入-半角-英文符号    1                    *!*    中文输入-全角-英文符号    9
        *!*    英文输入-半角-中文符号    1024                *!*    英文输入-全角-中文符号    1032
        *!*    英文输入-半角-英文符号    0                    *!*    英文输入-全角-英文符号    8
        
        RETURN IIF(m._请求 = 0 OR m._请求 = 8 OR m._请求 = 1024 OR m._请求 = 1032, 0, 1)
    ENDIF
    ******************

    DECLARE INTEGER FindWindow IN user32 AS "ls_FindWindow" STRING, STRING
    DECLARE INTEGER FindWindowEx IN user32 AS "ls_FindWindowEx" INTEGER, INTEGER, STRING, STRING
    DECLARE INTEGER PostMessage IN user32 AS "ls_PostMessage" INTEGER, INTEGER, INTEGER, INTEGER

    LOCAL m.lnHwnd1, lnHwnd2, m.lnHwnd3, m.lnHwnd4
    m.lnHwnd1 = ls_FindWindow("Shell_TrayWnd", 0)
    m.lnHwnd2 = ls_FindWindowEx(m.lnHwnd1, 0, "TrayNotifyWnd", NULL)
    m.lnHwnd3 = ls_FindWindowEx(m.lnHwnd2, 0, "TrayInputIndicatorWClass", NULL)
    m.lnHwnd4 = ls_FindWindowEx(m.lnHwnd3, 0, "IMEModeButton", NULL)

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

    ls_PostMessage(m.lnHwnd4, WM_LBUTTONDOWN, MK_LBUTTON, 1)        && 按下左键
    ls_PostMessage(m.lnHwnd4, WM_LBUTTONUP, MK_LBUTTON, 1)        && 放开左键

    CLEAR DLLS "ls_FindWindow", "ls_FindWindowEx", "ls_PostMessage"
ENDFUNC


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

2023-01-12 18:50
kangss
Rank: 4
等 级:贵宾
威 望:10
帖 子:138
专家分:237
注 册:2014-6-12
得分:0 
有人说怎么不模拟“CTRL+空格键”或“Shift”?
如果客户修改了快捷键,会导致失灵,没有点击输入法图标效果稳妥。

2023-01-12 19:02
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
对第三方的输入法有效吗?
2023-01-12 19:09
nbwww
Rank: 6Rank: 6
等 级:贵宾
威 望:10
帖 子:222
专家分:468
注 册:2021-1-9
得分:0 
2023-01-12 19:12
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:0 
以下是引用kangss在2023-1-12 18:50:56的发言:

客户电脑上的win10输入密码的时候,总是默认中文,实在是不得劲
看到论坛上有人问了,就想着顺便搞搞

测试有效,顺便请教:
1. 此函数在其他 windows 版本是否也可用?条件所限,本本只装了 win10,有点懒,不想装虚拟机
2. 其他输入法是否也有效?我只装了搜狗输入法
3. 是否有办法判断全角/半角状态?部分脑残和年纪偏大且被迫使用电脑工作人士,教不会!特别在输入登录密码时,狂抓!
2023-01-12 19:15
kangss
Rank: 4
等 级:贵宾
威 望:10
帖 子:138
专家分:237
注 册:2014-6-12
得分:0 
以下是引用csyx在2023-1-12 19:15:04的发言:


测试有效,顺便请教:
1. 此函数在其他 windows 版本是否也可用?条件所限,本本只装了 win10,有点懒,不想装虚拟机
2. 其他输入法是否也有效?我只装了搜狗输入法
3. 是否有办法判断全角/半角状态?部分脑残和年纪偏大且被迫使用电脑工作人士,教不会!特别在输入登录密码时,狂抓!


这个代码是给输入法发消息,获取“中”“英”状态,再模拟鼠标点击输入法改变“中”“英”状态

是否有办法判断全角/半角状态,这个没研究过,感觉应该可以
2023-01-12 19:26
nbwww
Rank: 6Rank: 6
等 级:贵宾
威 望:10
帖 子:222
专家分:468
注 册:2021-1-9
得分:0 
经测试 WIN10  微软拼音   0是乒乓键    1无效
2023-01-12 19:31
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:0 
以下是引用kangss在2023-1-12 19:26:46的发言:
这个代码是给输入法发消息,获取“中”“英”状态,再模拟鼠标点击输入法改变“中”“英”状态

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


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

win10输入法(0)   可以切回
2023-01-12 19:36



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




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

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