西西软件园多重安全检测下载网站、值得信赖的软件下载站!
软件
软件
文章
搜索

首页编程开发其它知识 → 软键盘的开发技巧 模拟键盘输入

软键盘的开发技巧 模拟键盘输入

相关软件相关文章发表评论 来源:西西整理时间:2011/5/20 10:19:17字体大小:A-A+

作者:西西点击:333次评论:1次标签: 软键盘

Adobe AIR for Androidv25.0.0.108安卓版
  • 类型:安卓其它大小:21.7M语言:中文 评分:10.0
  • 标签:
立即下载

在嵌入式应用和一些安全软件中经常需要不通过物理键盘输入,虽然微软提供了也一个软键盘,但这个软件盘不能定制界面不能自动感应当前光标是否处于输入状态,所以有时候我们还是需要自己来实现这个软键盘。本文将讲解自己实现软键盘时涉及到的几个关键技术。

一、浮动窗体的实现

软键盘的窗体和普通窗体不一样,这个窗体在成为当前窗体时,不会影响其它进程的窗体的光标焦点。也就是说虽然这个窗体现在为当前激活的前台窗体,但光标仍然停在其他进程的窗体上。

如上图所示,虽然软键盘在记事本的前面,但光标仍然在记事本上。

要实现这个技术,我们必须要把当前窗体设置为浮动工具条才行。这里我给出 C# Winform 的实现方法:

        private const int WS_EX_TOOLWINDOW = 0x00000080;
        private const int WS_EX_NOACTIVATE = 0x08000000;
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= (WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW);
                cp.Parent = IntPtr.Zero; // Keep this line only if you used UserControl
                return cp;
                //return base.CreateParams;
            }
        } 

如上代码就是将 Winform 指定为浮动工具条窗体。只要在winform 的类中重载 CreateParams 函数,并按上述代码编写就可以了。

二、如何检测当前处于输入状态

在一些嵌入式设备中,我们没有物理键盘,所有的输入都是通过触摸屏和软键盘输入。那么这个时候,我们必须要做到只有处于输入状态时才弹出软键盘,否则如果软键盘一直在界面上,既不美观也妨碍其他程序的正常使用。

要实现这个功能,我们能想到的最直接的方法是 windows 是否会在当前处于输入状态下时发一个什么事件,或者通过什么钩子程序来实现。但我研究了很久,没有找到这种方法。如果哪位知道这种方法,不妨在回复中告诉我。

我目前找到的方法是定时询问 windows 的当前窗体是否处于输入状态。

            IntPtr hWnd = GetForegroundWindow();
            uint processId;
            uint threadid = GetWindowThreadProcessId(hWnd, out processId);
            GUITHREADINFO lpgui = new GUITHREADINFO();
            lpgui.cbSize = Marshal.SizeOf(lpgui);
            if (GetGUIThreadInfo(threadid, ref lpgui))
            {
                if (lpgui.hwndCaret != 0)
                {
                    return hWnd;
                }
            }

如上面代码所示

首先我们通过  GetForegroundWindows API 得到当前窗体的句柄。然后我们再通过 GetGUIThreadInfo 得到当前窗体的一些属性。这些属性在 GUITHREADINFO 中定义

        public struct GUITHREADINFO
        {
            public int cbSize;
            public int flags;
            public int hwndActive;
            public int hwndFocus;
            public int hwndCapture;
            public int hwndMenuOwner;
            public int hwndMoveSize;
            public int hwndCaret;
            public System.Drawing.Rectangle rcCaret;
        }

上面是  GUITHREADINFO  结构。我们可以通过这个信息得到当前窗体中当前焦点的子窗口句柄,当前获得光标的子窗口句柄,当前正激活的子窗体句柄等等。这里我们只要用到当前获得光标的子窗口句柄,就是 hwndCaret 。如果hwndCaret 不为0,则表示当前窗体处于可输入状态。

相关API函数的 C# 定义如下:

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetGUIThreadInfo(uint idThread, ref GUITHREADINFO lpgui);
        [DllImport("user32.dll")]
        public static extern IntPtr GetForegroundWindow();
        [DllImport("user32.dll", SetLastError = true)]
        static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

三、模拟键盘输入

模拟键盘输入比较简单,.Net 提供了一个静态函数来模拟键盘输入

System.Windows.Forms.SendKeys.Send

这个函数很简单,而且微软的帮助也很全面了,我这里就不多说了。

另外我们还可以用更加底层的 API 函数来模拟键盘的输入

        [DllImport("user32.dll")]
        static extern void keybd_event(byte bVk, byte bScan, uint dwFlags,
           int dwExtraInfo);

这个函数是 keybd_event,关于这个函数的使用,微软的帮助也写的很清楚,这里也不重述了。

    Adobe
    (300)Adobe
    是一家总部位于美国加州圣何塞的电脑软件公司。公司由乔恩沃诺克和查理斯格什克创建于年月,他们先前都曾任职于施乐公司的帕洛阿尔托研究中心,离开后组建了系统公司,使得页描述语言得到商业化应用。这个名字没有传奇的来历,它仅仅是来源于其创始人的河流老家背后那条流淌的小河之名。套装包括图像处理软件矢量图形编辑软件音频编辑软件文档创作软件网页编辑软件二维矢量动画创作软件视频特效编辑软件视频剪辑软件环境...更多>>
    • Adobe Premiere Pro 1.5 英汉切换工

      08-22 / 16.0M

      推荐理由:☆ 主要功能:本工具包含 Premiere Pro 1.5 汉化程序、英化程序和刷新程序,可让您随时在 99%的汉化和100%
    • AdobeReaderWP8版10.4.4.0 官方版

      04-28 / 4.3M

      推荐理由:AdobeReaderWP8版是一款强大的PDF工具,支持各类PDF文档的阅读和编辑,强大的编辑功能让你可以随心所欲的比
    • Adobe Photoshop(PS)CS 8.01 简体中

      05-15 / 150.1M

      推荐理由:Adobe Photoshop CS 8.01 大家所熟悉的Photoshop 7.0的下一代产品不是叫做Photoshop 8.0了,而是被命名为Ph
    • Adobe Reader加速器 PDF SpeedUp3.

      01-05 / 566KB

      推荐理由: 为Adobe Reader提速的免费小工具。  支持Adobe Acrobat 5, 6, 7, 8, 9, Adobe Reader 5, 6, 7, 8, 9。
    • Adobe Collage1.0.0

      11-16 / 17M

      推荐理由: Adobe面向移动平台推出的一款图像拼贴工具,可以将图像、背景、文字等内容自由组合在一起。  Adobe
    • Adobe Shadowv2.0 官方版

      04-13 / 11.9M

      推荐理由:Adobe为移动开发者打造的解决网页应用跨平台问题的工具。由于移动设备(Android)屏幕的尺寸和规格不一样,网

    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶
    • 1 难过难过
    • 5 囧
    • 3 围观围观
    • 2 无聊无聊

    热门评论

    最新评论

    发表评论 查看所有评论(1)

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
    字数: 0/500 (您的评论需要经过审核才能显示)