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 ...
随机推荐
- Qt入门-第一个Qt程序
在安装完之后,迫不及待创建第一个Qt demo
- 新建tomcat的server服务,在左侧项目浏览处,右键空白的地方,选择new,再选择other选项
新建tomcat的server服务,在左侧项目浏览处,右键空白的地方,选择new,再选择other选项. 在弹出的窗口中,下拉滚动条找到Server,并单击next按钮. 在弹出的窗口中,找到第一个A ...
- 图解KMP算法
- Zephyr Introduction
wiki Importer Workflow wiki https://zephyrdocs.atlassian.net/wiki/display/ZTD/Zephyr+for+JIRA+Docume ...
- Linux编译提速
一.简介 项目越来越大,重新编译整个项目是一件很费时的事,总结可以帮助提速方法,如下: 1)tmpfs: 解决IO瓶颈,充分利用本机内存资源 2)make -j: 充分利用本机计算资源 3)distc ...
- django获取字段列表(values/values_list/flat)
django获取字段列表(values/values_list/flat) values方法可以获取number字段的字典列表 values_list可以获取number的元组列表 values_li ...
- 循环删除DataTable.Row中的多行问题
在C#中,如果要删除DataTable中的某一行,大约有以下几种办法: 1,使用DataTable.Rows.Remove(DataRow),或者DataTable.Rows.RemoveAt(ind ...
- SQL语句学习积累·数据的操作
数据的操作 select 取表中前五条数据 select top 5 from table_name 取表中前50%的数据 select top 50 percent from table_name ...
- Controller级别的异常处理过滤器IExceptionFilter
1,系统自带的HandleErrorAttribute类继承自IExceptionFilter,是MVC的默认实现. 同时设置web.config <system.web> <cus ...
- angular 基本依赖注入
import { Injectable } from '@angular/core'; @Injectable() export class ProductServiceService { const ...