qq_52257484 2023-12-09 20:46 采纳率: 68.8%
浏览 5
已结题

C#窗口程序设计+钩子函数使用

如何用C#做一个数字键盘,调用钩子实现键盘输入?这个键盘不是电脑上的实际键盘,而是虚拟的键盘,winform上自己用一些控件设计的键盘。钩子函数能不能监测自己设计的虚拟键盘,而不是实际的键盘?

  • 写回答

3条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-12-09 21:35
    关注

    所有内容均由人工智能模型输出,其内容的准确性和完整性无法保证,不代表我的态度或观点。
    (讯飞星火专栏,V3.0版本,2023.10.24)


    该回答引用讯飞星火认知大模型,仅提供参考,不保证完全正确
    要实现一个数字键盘,并使用钩子函数监测虚拟键盘的输入,可以按照以下步骤进行:

    1. 创建一个WinForm应用程序。
    2. 在窗体上添加自定义的数字键盘控件,例如按钮、文本框等。
    3. 为每个数字键盘控件添加点击事件处理程序。
    4. 在窗体的Load事件中,安装全局钩子以捕获键盘输入。
    5. 在窗体的Unload事件中,卸载全局钩子。
    6. 在全局钩子的回调函数中,检查按键事件是否与自定义数字键盘相关。如果是,则处理相应的逻辑。

    以下是一个简单的示例代码:

    using System;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace VirtualKeyboardDemo
    {
        public partial class MainForm : Form
        {
            // 定义钩子类型和回调函数原型
            private const int WH_KEYBOARD_LL = 13;
            private const int WM_KEYDOWN = 0x0100;
            private const int WM_SYSKEYDOWN = 0x0104;
            private const int HC_ACTION = 0;
            private IntPtr hHook = IntPtr.Zero;
    
            [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
            private static extern IntPtr SetWindowsHookEx(int idHook, IntPtr lpfn, IntPtr hMod, uint dwThreadId);
    
            [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
            private static extern bool UnhookWindowsHookEx(IntPtr hhk);
    
            public MainForm()
            {
                InitializeComponent();
                // 安装钩子
                InstallHook();
            }
    
            private void InstallHook()
            {
                hHook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, IntPtr.Zero, 0);
                if (hHook == IntPtr.Zero)
                {
                    throw new Exception("Failed to install hook");
                }
            }
    
            private void UninstallHook()
            {
                if (hHook != IntPtr.Zero)
                {
                    UnhookWindowsHookEx(hHook);
                    hHook = IntPtr.Zero;
                }
            }
    
            private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
            {
                UninstallHook();
            }
    
            private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
            {
                if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
                {
                    // 获取按键信息
                    KBDLLHOOKSTRUCT keyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));
    
                    // 检查按键是否与自定义数字键盘相关
                    if (keyInfo.vkCode >= VK_NUMPAD0 && keyInfo.vkCode <= VK_NUMPAD9)
                    {
                        // 处理按键事件,例如更新数字键盘显示
                        int keyValue = keyInfo.vkCode - VK_NUMPAD0;
                        Console.WriteLine("按下的数字键:" + keyValue);
                    }
                }
    
                return CallNextHookEx(hHook, nCode, wParam, lParam);
            }
        }
    }
    

    注意:这个示例代码仅用于演示目的,实际应用中可能需要根据具体需求进行调整。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月2日
  • 已采纳回答 12月25日
  • 创建了问题 12月9日

悬赏问题

  • ¥15 rt-thread线程切换的问题
  • ¥20 python忆阻器数字识别
  • ¥15 无法输出helloworld
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊