C#实现屏幕键盘(ScreenKeyboard)

要实现一个屏幕键盘,需要监听所有键盘事件,无论窗体是否被激活。因此需 要一个全局的钩子,也就是系统范围的钩子。

什么是钩子(Hook)

钩子(Hook)是Windows提供的一种消息处理机制平台,是指在程序正常 运行中接受信息之前预先启动的函数,用来检查和修改传给该程序的信息,(钩 子)实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定 的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数 先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理 而继续传递该消息,还可以强制结束消息的传递。注意:安装钩子函数将会影响 系统的性能。监测“系统范围事件”的系统钩子特别明显。因为系统 在处理所有的相关事件时都将调用您的钩子函数,这样您的系统将会明显的减慢 。所以应谨慎使用,用完后立即卸载。还有,由于您可以预先截获其它进程的消 息,所以一旦您的钩子函数出了问题的话必将影响其它的进程。

钩子的作 用范围

一共有两种范围(类型)的钩子,局部的和远程的。局部钩子仅钩 挂自己进程的事件。远程的钩

子还可以将钩挂其它进程发生的事件。远程 的钩子又有两种: 基于线程的钩子将捕获其它进程中某一特定线程的事件。简言 之,就是可以用来观察其它进程中的某一特定线程将发生的事件。系统范围的钩 子将捕捉系统中所有进程将发生的事件消息。

Hook 类型

Windows 共有14种Hooks,每一种类型的Hook可以使应用程序能够监视不同类型的系统消息 处理机制。下面描述所有可以利用的Hook类型的发生时机。详细内容可以查阅 MSDN,这里只介绍我们将要用到的两种类型的钩子。

(1) WH_KEYBOARD_LL Hook

WH_KEYBOARD_LL Hook监视输入到线程消息队列中的 键盘消息。

(2)WH_MOUSE_LL Hook

WH_MOUSE_LL Hook监视输入到 线程消息队列中的鼠标消息。下面的 class 把 API 调用封装起来以便调用。

1// NativeMethods.cs
2using System;
3using System.Runtime.InteropServices;
4using System.Drawing;
5
6namespace CnBlogs.Youzai.ScreenKeyboard {
7  [StructLayout (LayoutKind.Sequential)]
8  internal struct MOUSEINPUT {
9     public int dx;
10    public int dy;
11     public int mouseData;
12    public int dwFlags;
13     public int time;
14    public IntPtr dwExtraInfo;
15   }
16
17  [StructLayout(LayoutKind.Sequential)]
18   internal struct KEYBDINPUT {
19    public short wVk;
20     public short wScan;
21    public int dwFlags;
22     public int time;
23    public IntPtr dwExtraInfo;
24  }
25
26  [StructLayout(LayoutKind.Explicit)]
27  internal struct Input {
28    [FieldOffset(0)]
29     public int type;
30    [FieldOffset(4)]
31     public MOUSEINPUT mi;
32    [FieldOffset(4)]
33     public KEYBDINPUT ki;
34    [FieldOffset(4)]
35     public HARDWAREINPUT hi;
36  }
37
38  [StructLayout (LayoutKind.Sequential)]
39  internal struct HARDWAREINPUT {
40    public int uMsg;
41    public short wParamL;
42    public short wParamH;
43  }
44
45   internal class INPUT {
46    public const int MOUSE = 0;
47    public const int KEYBOARD = 1;
48    public const int HARDWARE = 2;
49  }
50
51  internal static class NativeMethods {
52    [DllImport("User32.dll", CharSet = CharSet.Auto, SetLastError = false)]
53    internal static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);
54
55    [DllImport("User32.dll", CharSet = CharSet.Auto, SetLastError = false)]
56    internal static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
57
58     [DllImport("User32.dll", EntryPoint = "SendInput", CharSet = CharSet.Auto)]
59    internal static extern UInt32 SendInput(UInt32 nInputs, Input[] pInputs, Int32 cbSize);
60
61    [DllImport("Kernel32.dll", EntryPoint = "GetTickCount", CharSet = CharSet.Auto)]
62     internal static extern int GetTickCount();
63
64     [DllImport("User32.dll", EntryPoint = "GetKeyState", CharSet = CharSet.Auto)]
65     internal static extern short GetKeyState(int nVirtKey);
66
67     [DllImport("User32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Auto)]
68     internal static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
69  }
70}

时间: 2024-08-03 15:42:18

C#实现屏幕键盘(ScreenKeyboard)的相关文章

win7系统屏幕键盘的关闭方法

  win7系统触屏键盘开启方法: 1.点击开始菜单,点击"控制面板"; 2.将"控制面板"中查看方式修改为"大图标",然后点击"轻松访问中心"; 3.在"轻松访问中心"左侧点击"启动屏幕键盘"即可打开. 如果不想用了,我们只需点击"桌面键盘"右上角的"叉"即可关闭.

用钩子(hook)实现C#的屏幕键盘效果

要实现一个屏幕键盘,需要监听所有键盘事件,无论窗体是否被激活.因此需要一个全局的钩子,也就是系统范围的钩子. 什么是钩子(Hook) 钩子(Hook)是windows提供的一种消息处理机制平台,是指在程序正常运行中接受信息之前预先启动的函数,用来检查和修改传给该程序的信息,(钩子)实际上是一个处理消息的程序段,通过系统调用,把它挂入系统.每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权.这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该

windows8 开启屏幕键盘的几种方法

一.在"开始屏幕"空白处右击选择"所有程序"(触屏可用手指从屏幕下方边缘往上移动一下),在所有程序中可以找到"屏幕键盘" 二.可以在控制面板中打开"轻松访问中心",快捷键"win+U",直接找到屏幕键盘(可适用于win7) 三.在win8传统桌面上任务栏右击选择"工具栏",可以找到"屏幕键盘",然后在任务栏上显示打开屏幕键盘的快捷按钮,单击打开 电脑常识 四.打开&q

Windows 8系统屏幕键盘怎么开启呢

Windows 8系统屏幕键盘怎么开启呢?开启Win 8屏幕键盘的四种方法 : 一.可以在控制面板中打开"轻松访问中心",快捷键"win+U",直接找到屏幕键盘(可适用于win7) 二.在"开始屏幕"空白处右击选择"所有程序"(触屏可用手指从屏幕下方边缘往上移动一下),在所有程序中可以找到"屏幕键盘" 三.在win8传统桌面上任务栏右击选择"工具栏",可以找到"屏幕键盘&quo

Win8屏幕键盘的3种开启方法

随着Win8的上市以及普及,越来越多的设备将支持触屏,所以屏幕键盘将会有更多的机会使用.下面小编将诉您鲜为人知的开启屏幕键盘的三种方法: 一.在"开始屏幕"空白处右击选择"所有程序"(触屏可用手指从屏幕下方边缘往上移动一下),在所有程序中可以找到"屏幕键盘" 二.可以在控制面板中打开"轻松访问中心",快捷键"win+U",直接找到屏幕键盘(可适用于win7) 三.在win8传统桌面上任务栏右击选择"

win7系统屏幕键盘怎么关闭

  win7系统屏幕键盘怎么关闭 1.点击开始菜单,点击"控制面板"; 2.将"控制面板"中查看方式修改为"大图标",然后点击"轻松访问中心"; 3.在"轻松访问中心"左侧点击"启动屏幕键盘"即可打开. 如果不想用了,我们只需点击"桌面键盘"右上角的"叉"即可关闭. windows7教程 windows8教程 windows10教程

Win8屏幕键盘怎么打开

  我们在日常使用电脑中常会有出现键盘某一个键,不能使用的情况,马上去买个新键盘是肯定不可能的了,那么这时我们应该如何处理呢?通常这个时候我们会想到屏幕键盘,没错,使用屏幕键盘可以帮我们很好的解决此类问题,尤其一些Win8电脑支持触摸屏操作,此时Win8屏幕键盘则派上了大用场,那么Win8屏幕键盘怎么打开呢?以下我们一起来解读下. 第一种:打开输入法自带的软键盘 我们以搜狗输入法为例:在输入法上面点击右键,在弹出的输入法菜单上选择软键盘,接下来在弹出的软键盘中选择电脑键盘就可以了,如下图. 第二

Windows 7 屏幕键盘使用

屏幕键盘主要是面向临时取代物理键盘作为数据输入或控制使用,支持单键和组合键输入,相比网银上的屏幕键盘,等系统自带的键盘安全性相对要低一些,还是要比物理键盘要好,作为特殊帐号密码输入或临时的服务器管理时,有时还是用的着. 一.启动Windows 7的屏幕键盘 Windows 7屏幕键盘之前有个众多周知的38数字BUG,不过现在已经修复了,启动后Windows 7屏幕方法: 1.依次点击:开始->控制面板->轻松访问->轻松访问中心,如果只是临时启动屏幕键盘,只需要点击图中的启动图标,如果需

Windows8.1屏幕键盘详解

  提起Windows 8,也许绝大部分人都把注意力集中在界面和操作习惯的变化上,喜欢的人说好,而不喜欢的人也不会吝惜口水,谁也说服不了谁.抛开这些主观性的争论不谈,其实Windows 8间接推动了不少技术的前进脚步.比方说对触控显示屏的推动,在Windows 8之前,触屏的使用基本都集中在手机和平板设备上.随着Windows 8问世,配备触控屏的Win8平板以及一体机等新型个人电脑大量上市,让更多普通用户知道了原来Windows电脑也可以触控操作. 随着不久前Windows 8.1预览版发布,