用Winform实现屏幕小键盘

简介:

前几天碰到一个问题,需要使用Winform实现屏幕小键盘,研究了一下,有一个自认为比较完美的解决方案。

屏幕小键盘的实现方式很简单,无非就是在窗体上加上几个按钮,然后在鼠标的点击事件里使用SendKeys.Send函数将按钮代表的字符输入到当前激活的窗口里面。

因此如何保证小键盘窗口永远不会获取鼠标焦点,是实现屏幕小键盘的关键。一般的窗口如果有鼠标在它上面操作的话,那么这个窗口默认就处于激活(Activated)状态,所有的键盘鼠标输入都是被操作系统重定向到桌面上激活(Activated)状态的窗体上。这样就会产生类似下面描述的矛盾:

1.       打开一个Windows程序,比如说notepad.exe

2.       启动屏幕小键盘程序keyboard.exe

3.       keyboard.exe上面点击按钮,这时keyboard.exe处于激活状态因为它获取到了鼠标焦点。

4.       SendKeys.Send函数没有办法把对应的字符输入到notepad.exe里面,因为notepad.exe不能获取鼠标焦点它不是桌面上处于激活状态的窗口。

为了解决上面的矛盾,Win32 API里面,CreateWindowEx的第一个参数dwExStyle如果设置为WS_EX_NOACTIVATE,那么创建的窗口则不会被操作系统设置为激活状态。因此如果我们能够在创建keyboard.exe的时候,通知Winform函数库将其创建成一个WS_EX_NOACTIVATE就可以了,这就是为什么Winform函数库里面有一个Form.CreateParams这个属性,在从Form类继承下来的窗体中重载这个属性,就可以在Winform创建窗口之前,修改创建参数了。

下面是keyboard.exe小键盘窗口的源代码, 当然在创建这个窗口的时候,最好将窗口的Topmost属性设置为true

    public partial class Form2 : Form

    {

        protected override CreateParams CreateParams

        {

            get

            {

                CreateParams cp = base.CreateParams;

                cp.ExStyle |= (int)0x08000000L;

                return cp;

            }

        }

 

        public Form2()

        {

            InitializeComponent();

        }

 

        // 屏幕小键盘上的一个按钮“A”

        private void button1_Click(object sender, EventArgs e)

        {

            SendKeys.Send("A");

        }

    }

标签:  NETWinform
本文转自 donjuan 博客园博客,原文链接:  http://www.cnblogs.com/killmyday/archive/2009/09/11/1564673.html  ,如需转载请自行联系原作者

相关文章
|
C# 编解码
WPF C# 多屏情况下,实现窗体显示到指定的屏幕内
原文:WPF C# 多屏情况下,实现窗体显示到指定的屏幕内 针对于一个程序,需要在两个显示屏上显示不同的窗体,(亦或N个显示屏N个窗体),可以使用如下的方式实现。
4666 0
|
10天前
设置WebStorm用Ctrl+鼠标滚轮上、下调整编辑器代码字体大小
设置WebStorm用Ctrl+鼠标滚轮上、下调整编辑器代码字体大小
|
9月前
|
Windows
分享:如何在VB中添加鼠标滚轮
分享:如何在VB中添加鼠标滚轮
解决C#winForm窗口闪烁问题
三种解决方法: 1.在构造方法中设置 ControlStyles 的OptimizedDoubleBuffer 和AllPaintingInWmPaint为True,完全启用双缓冲。 2.设置CreateParams的ExStyle为ExStyle 为 0x02000000 (WS_EX_COMPOSITED) 3.这种方法不会加快绘制的过程。当发生绘制时,窗体只是停留在不可见的状态,当绘制完成后就会在屏幕上弹出
1462 0
解决C#winForm窗口闪烁问题
|
C#
C# WPF 中用代码模拟鼠标和键盘的操作
原文:C# WPF 中用代码模拟鼠标和键盘的操作   原文地址   C#开发者都知道,在Winform开发中,SendKeys类提供的方法是很实用的。
2141 0
|
C#
WPF窗体隐藏鼠标光标的方法
原文:WPF窗体隐藏鼠标光标的方法 要引用 System.Windows.Input;   Mouse.OverrideCursor = Cursors.
1549 0
|
C#
C#(Wpf)实现小键盘
原文:C#(Wpf)实现小键盘 花了一天时间小键盘基本功能已完成,先看看效果图吧!              默认:             Shift:     Caps Lock:   Button style ...
1213 0
|
C#
WPF 悬浮键盘
原文:WPF 悬浮键盘 public class TouchScreenKeyboard : Window { #region Property & Variable & Cons...
762 0
|
C#
WPF 获得鼠标相对于屏幕的位置,相对于控件的位置
原文:WPF 获得鼠标相对于屏幕的位置,相对于控件的位置 相对于屏幕的位置   第一步:     ///     /// 用于获得鼠标相对于屏幕的位置    ///     public class Win32    {        [StructLayout(LayoutKind.
1123 0
|
C# Windows
WPF中获取鼠标相对于屏幕的位置
原文:WPF中获取鼠标相对于屏幕的位置              WPF中获取鼠标相对于屏幕的位置                                   周银辉WPF编程时,我们经常使用Mouse.GetPosition(IInputElement relativeTo)或MouseEventArgs.GetPosition(IInputElement relativeTo)来获取鼠标相对于某一界面元素的相对位置,这自然也联想到另外的一个问题:如何获取鼠标相对于屏幕的位置。
1146 0