none
WPF中,用PeekMessage方法过滤微软拼音中文输入状态下的数字输入失效。 RRS feed

  • 问题

  • 在WPF的ComponentDispatcher.ThreadFilterMessage 事件中添加peekmessage函数,以达到过滤键盘某些按键的目的。此方法可成功过滤讯飞、搜狗等输入法中文输入状态下的数字输入,peekmessage返回值为true。在过滤微软拼音中文输入下的数字输入时,peekmessage返回值为true,但是输入框仍接收到了数字。
    2019年11月18日 6:11

答案

  • 问题已解决。

    PeekMessage有两种:

    1.ITfMessagePump::PeekMessageA method

    2.PeekMessageA function (Win32)

    第一种PeekMessage可以阻止微软拼音中文输入状态下的所有键盘输入。

     

    关键代码入下:

    [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("8f1b8ad8-0b6b-4874-90c5-bd76011e8f7c")]
    internal interface ITfMessagePump
    {
         bool PeekMessage(out MSG msg, IntPtr hwnd, uint wMsgFilterMin, uint wMsgFilterMax, uint wRemoveMsg);
    }

    [SecurityCritical, SuppressUnmanagedCodeSecurity, DllImport("msctf.dll")]
    public static extern int TF_GetThreadMgr(out ITfMessagePump xMessagePump);

    //将PeekMessage进行封装,此时可直接调用

    public static bool PeekMessage()
    {
            ITfMessagePump threadManager;
            bool peekResult=false;
            if (TSF_NativeAPI.TF_GetThreadMgr(out threadManager) == 0)
            {
                    MSG msg;
                    peekResult=threadManager.PeekMessage(out msg, IntPtr.Zero, Win32Consts.WM_KEYDOWN,                              Win32Consts.WM_KEYUP, 1);
             }
             return peekResult;
    }


    • 已标记为答案 WUZYJOE 2019年11月20日 8:21
    2019年11月20日 8:21

全部回复

  • 相同测试条件下,此时,微软拼音中文输入状态下peekmessage又返回了false,反复测试,返回的都是false,过滤失败。
    2019年11月18日 9:15
  • Hi,

    有很多种方法去阻止键盘输入,你现在的目的只是阻止键盘某些键的输入?你可以提供你的代码。我可以测试一下,或许可以找出你的问题,或者提供另一种方法给你。

    Best Regards,

    Alex


    如果您对Visual Studio 或Microsoft Azure相关产品感兴趣,请点击此链接,或扫描以下二维码注册获取相关信息。



    2019年11月19日 6:30
  • 感谢回复。

    我的目的是 阻止在微软拼音输入法的中文输入状态下 例如‘1’,‘2’,‘3’的输入。

    代码:github.com/aelij/RawInputProcessor

    2019年11月19日 7:49
  • 问题已解决。

    PeekMessage有两种:

    1.ITfMessagePump::PeekMessageA method

    2.PeekMessageA function (Win32)

    第一种PeekMessage可以阻止微软拼音中文输入状态下的所有键盘输入。

     

    关键代码入下:

    [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("8f1b8ad8-0b6b-4874-90c5-bd76011e8f7c")]
    internal interface ITfMessagePump
    {
         bool PeekMessage(out MSG msg, IntPtr hwnd, uint wMsgFilterMin, uint wMsgFilterMax, uint wRemoveMsg);
    }

    [SecurityCritical, SuppressUnmanagedCodeSecurity, DllImport("msctf.dll")]
    public static extern int TF_GetThreadMgr(out ITfMessagePump xMessagePump);

    //将PeekMessage进行封装,此时可直接调用

    public static bool PeekMessage()
    {
            ITfMessagePump threadManager;
            bool peekResult=false;
            if (TSF_NativeAPI.TF_GetThreadMgr(out threadManager) == 0)
            {
                    MSG msg;
                    peekResult=threadManager.PeekMessage(out msg, IntPtr.Zero, Win32Consts.WM_KEYDOWN,                              Win32Consts.WM_KEYUP, 1);
             }
             return peekResult;
    }


    • 已标记为答案 WUZYJOE 2019年11月20日 8:21
    2019年11月20日 8:21