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 ...
随机推荐
- solr第二天 京东案例 课程文档 有用
全文检索技术 Lucene&Solr Part3 1. 课程计划 1. Solr配置中文分析器 a) Schema.xml的配置 b) 配置IKAnalyzer ...
- 方向ajax(http long request实现实时通信)
现在我们就要通过这种方法来实现实时通信,先说一下原理: 客户端发起一个ajax长链接查询,然后服务端就开始执行代码,主要是检查某个文件是否被更新,如果没有,睡一会(sleep),醒来接着检查 如果客户 ...
- codefirst updatebase
http://blog.csdn.net/dj2008/article/details/23756895 http://blog.csdn.net/gentle_wolf/article/detail ...
- hdu1269 Tarjan强连通分量 模板(转)
#include<stdio.h> #include<iostream> #include<vector> using namespace std; ; vecto ...
- 黑盒测试实践--Day7 12.1
黑盒测试实践--Day7 12.1 今天完成任务情况: 录制小组作业中的自动化测试工具实践视频 汇总大家提交的各种作业模块,打包完成小组共同作业 小组成员完成个人情况说明后在截止时间前分别提交作业 小 ...
- MySQL事务隔离级别测试实例
https://www.cnblogs.com/huanongying/p/7021555.html MySQL事务隔离级别 事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommit ...
- eWebEditor9.x整合教程-Xproer.WordPaster
版权所有 2009-2017 荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webplug/wordpa ...
- 编写高质量代码改善C#程序的157个建议——建议25:谨慎集合属性的可写操作
建议25:谨慎集合属性的可写操作 如果类型的属性中有集合属性,那么应该保证属性对象是由类型本身产生的.如果将属性设置为可写,则会增加抛出异常的几率.一般情况下,如果集合属性没有值,则它返回的Count ...
- indexOf(String.indexOf 方法)
字符串的IndexOf()方法搜索在该字符串上是否出现了作为参数传递的字符串,如果找到字符串,则返回字符的起始位置 (0表示第一个字符,1表示第二个字符依此类推)如果说没有找到则返回 -1 返回 St ...
- 以太坊系列之七: p2p模块的dial--以太坊源码学习
dial.go阅读手记 dial.go是负责和peer建立连接关系的地方,主要是实现 type dialer interface { /* peers已经有的结点 */ newTasks(runnin ...