检测屏幕键盘是否打开(TabTip.exe)

 嘿嘿可爱无罪 发布于 2023-02-06 20:48

我正在开发一个WPF/C#应用程序来填写表单.我试图找到一种方法来确定TapTip键盘(用于Windows 8桌面的TabTip.exe /类似地铁的键盘)是否在Windows 8中最小化/不可见.

我已经能够检测到osk键盘(osk.exe/windows可访问性屏幕键盘)是否被最小化,但是相同的过程似乎不适用于TabTip键盘.

要检测键盘是否最小化,我:
1.找到键盘的进程
2.获取MainWindowHandle
3.使用WINDOWPLACEMENT的showCmd属性(使用MainWindowHandle找到)
4.使用showCmd值确定窗口是否最小化

我遇到的问题是:
- TabTip进程的MainWindowHandle为0(因此我无法使用它来查找WINDOWPLACEMENT信息)
- 当TabTip打开并最小化时,WINDOWPLACEMENT.showCmd的值相同

为了找到TabTip窗口的句柄,我使用ENUMWINDOWS来获取所有窗口句柄,使用GETWINDOWTHREADPROCESSID来获取进程ID,然后将id与TabTip进程id进行比较.

任何帮助都将不胜感激.这也是我的第一篇文章.我想我做得对,但如果没有,请告诉我如何解决它.

1 个回答
  • 在找到一个有效的方法之前我尝试了几种不同的方法.使用IsWindowVisible()不起作用,我也没有任何喜悦GetWindowPlacement()GetIconic().最后我用了GetWindowLong()并检查了WS_VISIBLE回来.一个快速的控制台应用程序演示如下:

    using System;
    using System.Diagnostics;
    using Microsoft.Win32;
    using System.Runtime.InteropServices;
    using System.Threading;
    
    namespace CSharpTesting
    {
        class Program
        {
            /// <summary>
            /// The window is initially visible. See http://msdn.microsoft.com/en-gb/library/windows/desktop/ms632600(v=vs.85).aspx.
            /// </summary>
            public const UInt32 WS_VISIBLE  = 0X94000000;
            /// <summary>
            /// Specifies we wish to retrieve window styles.
            /// </summary>
            public const int GWL_STYLE = -16;
    
            [DllImport("user32.dll")]
            public static extern IntPtr FindWindow(String sClassName, String sAppName);
    
            [DllImport("user32.dll", SetLastError = true)]
            static extern UInt32 GetWindowLong(IntPtr hWnd, int nIndex);
    
            static void Main(string[] args)
            {
                // Crappy loop to poll window state.
                while (true)
                {
                    if (IsKeyboardVisible())
                    {
                        Console.WriteLine("keyboard is visible");
                    }
                    else
                    {
                        Console.WriteLine("keyboard is NOT visible");
                    }
    
                    Thread.Sleep(1000);
                }
            }
    
            /// <summary>
            /// Gets the window handler for the virtual keyboard.
            /// </summary>
            /// <returns>The handle.</returns>
            public static IntPtr GetKeyboardWindowHandle()
            {
                return FindWindow("IPTip_Main_Window", null);
            }
    
            /// <summary>
            /// Checks to see if the virtual keyboard is visible.
            /// </summary>
            /// <returns>True if visible.</returns>
            public static bool IsKeyboardVisible()
            {
                IntPtr keyboardHandle = GetKeyboardWindowHandle();
    
                bool visible = false;
    
                if (keyboardHandle != IntPtr.Zero)
                {
                    UInt32 style = GetWindowLong(keyboardHandle, GWL_STYLE);
                    visible = (style == WS_VISIBLE);
                }
    
                return visible;
            }
        }
    }
    

    2023-02-06 20:53 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有