C# 检查键盘是否唤醒到桌面上显示
大概需要的win32函数
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName)
//返回值为具有指定类名和窗体名的窗体句柄
//软键盘的类名有很多,以IPTIP_Main_Window为例子
public static extern int GetWindowLong(IntPtr window, int index);
//用这个函数能够获得指定窗口的信息
//这里使用GWL_STYLE==-16, 得到窗口风格
public static extern IntPtr FindWindowEx(
IntPtr hwndParent,
IntPtr hwndChildAfter,
string lpszClass,
string lpszWindow);
//FindWindowEx是在窗口列表中寻找与指定条件相符的第一个子窗口
大概用到的常量
private const string CoreWindowClassName = "Windows.UI.Core.CoreWindow";
private const string ApplicationFrameHostClassName = "ApplicationFrameWindow";
private const string TextInputApplicationCaption = "Microsoft Text Input Application";
//最后一个是微软文本输入应用,其他不知道额
WS_EX_NOACTIVATE = 0x08000000;
WS_VISIBLE = 0x10000000;
//窗口不会变成前台窗口(Win2000)以上
//窗口可见(感觉这个才是重点)
具体细节
以下是本来判断是32还是64位的函数,但现在是判断这个句柄是否存在
private static bool IsValidHandle(IntPtr handle)
{
return (IntPtr.Size == )
? (handle.ToInt32() > )
: (handle.ToInt64() > );
}
到这里,流程大概是完整了,也就是说判断软件键盘是否是窗口可见状态。
当然为了防止意外,在最后面也用以下的函数,不断的去询问窗口列表
private static IntPtr FindTextInputWindow()
{
IntPtr lastProbed = IntPtr.Zero;
do
{
lastProbed = Win32.FindWindowEx(IntPtr.Zero, lastProbed, ApplicationFrameHostClassName, null);
if (IsValidHandle(lastProbed))
{
var textInput = Win32.FindWindowEx(lastProbed, IntPtr.Zero, CoreWindowClassName, TextInputApplicationCaption);
return textInput;
}
} while (IsValidHandle(lastProbed)); return IntPtr.Zero;
}
实际运用
有时候我们不知道键盘为什么起不来,但又想让它起来,这样通过以上的判断去发现键盘有没有显示在,没有就主动就唤醒
主要的代码,部分参数在另外的文件,需要自己添加哦
private static bool IsOpened()
{
return IsWin10OnScreenKeyboardVisible();
} private static bool IsWin10OnScreenKeyboardVisible()
{
IntPtr handle = Win32.FindWindow(TabTipWindowClassName, "");
if (!IsValidHandle(handle))
{
return false;
} var isVisible = IsWindowVisibleByHandle(handle);
if (isVisible.HasValue)
{
return isVisible.Value;
} var textInputHandle = FindTextInputWindow();
return IsValidHandle(textInputHandle);
} private static bool IsValidHandle(IntPtr handle)
{
return (IntPtr.Size == )
? (handle.ToInt32() > )
: (handle.ToInt64() > );
} private static bool? IsWindowVisibleByHandle(IntPtr handle)
{
var style = Win32.GetWindowLong(handle, GwlStyle); if ((style & Win32.WS_EX_NOACTIVATE) != )
{
return false;
} if ((style & Win32.WS_VISIBLE) != )
{
return true;
} // DWM Window can be cloaked
// see https://social.msdn.microsoft.com/Forums/vstudio/en-US/f8341376-6015-4796-8273-31e0be91da62/difference-between-actually-visible-and-not-visiblewhich-are-there-but-we-cant-see-windows-of?forum=vcgeneral
if (Win32.DwmGetWindowAttribute(handle, DwmwaCloaked, out var cloaked, ) == )
{
if (cloaked != )
{
return false;
}
} return null;
} private static IntPtr FindTextInputWindow()
{
IntPtr lastProbed = IntPtr.Zero;
do
{
lastProbed = Win32.FindWindowEx(IntPtr.Zero, lastProbed, ApplicationFrameHostClassName, null);
if (IsValidHandle(lastProbed))
{
var textInput = Win32.FindWindowEx(lastProbed, IntPtr.Zero, CoreWindowClassName, TextInputApplicationCaption);
return textInput;
}
} while (IsValidHandle(lastProbed)); return IntPtr.Zero;
}
C# 检查键盘是否唤醒到桌面上显示的更多相关文章
- c# Windows Service 桌面上显示UI
介绍 本文的目的是说明如何从Windows Vista中的服务正确启动交互式进程,以及演示如何以完全管理员权限启动该进程.交互式过程是能够在桌面上显示UI的过程. 本文介绍如何创建一个名为Loader ...
- Windows Server 2012 R2在桌面上显示计算机/网络图标
原文 Windows Server 2012 R2在桌面上显示计算机/网络图标 从Windows2012开始,微软取消了服务器桌面个性化选项,如何重新调出配置界面,可以使用微软命令调出.具体方法如下: ...
- 在linux桌面上显示图标
把应用程序的图标添加到桌面上 左图显示了把应用程序的图标添加到桌面上的两种方法,哪种更好看? 想要把应用程序图标添加到桌面上,请先确保已设置了在桌面上显示图标,方法是: 1.安装gnome-tweak ...
- Windows 10 如何在桌面上显示“此电脑”和“控制面板”
新电脑安装好 Windows 10 系统,默认在桌面上是不显示 "此电脑" 和 "控制面板" 图标的. 如果是 Windows 10 家庭版,桌面一般只显示&q ...
- 如何在windows server 2008的桌面上显示 我的电脑
装完windows server2008 r2 x64后发现桌面只有一个回收站图标,这一点和xp 20003都差不多,但是xp 2003很容易就把桌面上的 我的电脑 我的文档 网上邻居找到,但是win ...
- 消除TortoiseSVN 检出到(checkout)桌面上显示一堆问号
之前不小心直接将版本库的内容检出到桌面,后才发现桌面上的文件图标都变成了问号,新建文件夹也同样如此. 为了解决这个问题,采用如下方法(任何一个检出文件夹均可这样操作): 1.删除桌面隐藏的.SVN文件 ...
- 在Windows Server 2008的桌面上显示“我的电脑”“网上邻居”等图标?
装完windows server2008 r2 x64后发现桌面只有一个“回收站”图标,如何把“我的电脑”“网上邻居”等图标添加到桌面呢?操作步骤: 1. 点击 开始 在搜索中输入 icon 2. 点 ...
- Ubuntu 16.04 GNOME添加桌面图标/在桌面上显示图标
GNOME默认不能在桌面上创建文件夹,但是可以通过工具设置:用gnome-tweak-tool设置Nautilus接管桌面即可. 安装: sudo apt-get install gnome-twea ...
- Windows Server 2012 在桌面上显示”我的电脑”图标
1.本地方式如果是在Windows Server 2012本地控制台下,直接按Win(键盘上的微软徽标键)+R,输入: rundll32.exe shell32.dll,Control_RunDLL ...
随机推荐
- jQuery基础,选择器
jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨是“write Less, ...
- Apache apachectl命令
一.简介 apachectl命令是Apache的Web服务器前端控制工具,用以启动.关闭和重新启动Web服务器进程. 二.语法 http://www.jinbuguo.com/apache/menu2 ...
- Nhibernate HQL 匿名类(严格说是map的使用以及构造函数的使用
1.map的使用 var hql=string.Format(@"select new map( tc.LimitIndexType as LimitIndexType, tc.LimitS ...
- 1.python系统性能信息模块之psutil模块
Psutil(进程和系统实用程序)是一个跨平台的库,用于在Python中检索有关运行进程和系统资源利用率(CPU,内存,磁盘,网络)的信息.它主要用于系统监视,分析和限制系统资源及运行进程的管理.它实 ...
- Zynq 在Ubuntu上搭建编译环境
http://bbs.elecfans.com/jishu_487981_1_1.html 以下操作均在root用户下完成1,下载交叉编译器在ubuntu里下载arm-2010.09-62-arm-x ...
- poj1860 Currency Exchange(spfa判断正环)
Description Several currency exchange points are working in our city. Let us suppose that each point ...
- android onResultActivity不执行原因总结
插一个注意点.在用ArrayAdapter的时候数据那里的类型必须是List<String> 不能是ArrayList<String> 1.在A.Activity中调用star ...
- C# 常用正则验证[转]
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- strcmp返回值布尔类型的判断
strcmp: 用于比较两个字符串,原型如下: int strcmp ( char const *s1, char const *s2):如果s1小于s2,strcmp函数返回一个小于零的值.如果s1 ...
- Selenium API(一)
1.设置浏览器大小: # -*- coding:utf- -*- from selenium import webdriver import time driver = webdriver.Firef ...