当前位置:编程学习 > C#/ASP.NET >>

C# 全局钩子获取键值问题

大家好,我是剑走偏锋,今天实在想不通的问题,我来提上来,希望大家帮与解答,我先谢过了。

首先我说下问题,我这个程序运行后,能够在系统中挂上全局钩子,因为VS.NET 2005中无法在调试的模式中
进行安装钩子,所以我只能生成后开结果。

下面是我程序出现的2个问题:

       1.可以全局接受键盘输入,但是多点几次键盘后(大约15 - 20 次)后就会出现内存错误。
       2.在挂全局钩子后,我接收到的 "wParam" 还有 "lParam" 值 都不是我键盘所输入的键值
         请问我如何才能获取到??

        呵呵 我实在想不通,希望各位牛人多多帮助 我QQ : 250623008 邮箱:g0194776@126.com
        希望大家多多讨论。
===========》 以下是代码部分(完整)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using System.Runtime.InteropServices;

namespace API
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            SetHook();  //挂钩子
        }

        //安装钩子原型
        [DllImport("user32.dll", EntryPoint = "SetWindowsHookEx")]
        public static extern int SetWindowsHookEx(
            int idHook,
            MyHook lpfn,
            IntPtr hmod,
            int dwThreadId
        );

        //卸载钩子原型
        [DllImport("user32.dll", EntryPoint = "UnhookWindowsHookEx")]
        public static extern bool UnhookWindowsHookEx(
            int hHook
        );

        //回调钩子信息原型
        [DllImport("user32.dll", EntryPoint = "CallNextHookEx")]
        public static extern int CallNextHookEx(
            int hHook,
            int ncode,
            IntPtr wParam,
            IntPtr lParam
        );

        public delegate int MyHook(int nCode, IntPtr wParam, IntPtr lParam);  //建立委托用来回调
        static int hHook = 0;  //用来记录钩子编号
        const int WH_KEYBOARD_LL = 13;  //钩子类型

        //用来做钩子事件
        public int KeyBoard_HookPro(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (nCode < 0)
            {
                return CallNextHookEx(hHook, nCode, wParam, lParam);
            }
            else
            {
                try
                {
                    this.tb1.Text += "A";
                    //MessageBox.Show("接收到内容 :" + wParam.ToInt32());
                    return 1;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("产生了错误 : " + ex.Message);

                    return CallNextHookEx(hHook, nCode, wParam, lParam);
                }
            }
        }

        //此方法用来安装钩子
        public void SetHook()
        {
            try
            {
                if (hHook == 0)
                {
                    //开始安装钩子
                    hHook = SetWindowsHookEx(WH_KEYBOARD_LL,
                        new MyHook(this.KeyBoard_HookPro),
                        Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),
                        0);
                    if (hHook == 0)
                    {
                        MessageBox.Show("Install Globle KeyBoard 's Hook Fail......");
                    }
                    else
                    {
                        button1.Text = "卸载钩子";
                    }
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (button1.Text == "卸载钩子")
            {
                bool state = UnhookWindowsHookEx(hHook);
                if (state)
                {
                    button1.Text = "安装钩子";
                    MessageBox.Show("UnInstall Globe KeyBoard 's Hook Done!");
                }
                else
                {
                    MessageBox.Show("UnInstall Globe KeyBoard 's Hook File......");
                }
            }
            else
            {
                SetHook();
            }
        }

    }
}


问题解决后马山给分,谢谢了~! 
再次谢谢了 --------------------编程问答-------------------- 参考:http://blog.csdn.net/cocosoft/archive/2007/05/17/1613957.aspx
--------------------编程问答-------------------- Mark --------------------编程问答-------------------- 对于键盘钩子来说,参数的定义如下所示。

●   dwCode——键盘消息的处理方式。如果是HC_ACTION,表示收到一个正常的击键消息;如果是HC_NOREMOVE,表示对应消息并没有从消息队列中移去(当某个进程用指定PM_NOREMOVE 标志的PeekMessage函数获取消息时就是如此)。

●   wParam——按键的虚拟码(即Windows.inc中定义的VK_xxx值)。

●   lParam——按键的重复次数、扫描码和标志等数据,不同数据位的定义如下:

■   位0~15:按键的重复次数。

■   位16~23:按键的扫描码。

■   位24:按键是否是扩展键(F1与F2等Fx键,小键盘数字键等),如果此位是1表示按键是扩展键。

■   位25~28:未定义。

■   位29:如果Alt键在按下状态,此位置1,否则置0。

■   位30:按键的原先状态,消息发送前按键原来是按下的,此位被设置为1,否则置0。

■   位31:按键的当前动作,如果是按键按下,那么此位被设置为0;按键释放的话被设置为1。
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,