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

帮忙看个屏蔽键盘的钩子,在32位系统就报错,64位系统能运行

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

namespace TimeManager.Tool
{
    class KeyHook
    {
        //委托 
        public delegate int HookProc(int nCode, int wParam, IntPtr lParam); 
        static int hHook = 0; 
        public const int WH_KEYBOARD_LL = 13; 

        //LowLevel键盘截获,如果是WH_KEYBOARD=2,并不能对系统键盘截取,Acrobat Reader会在你截取之前获得键盘。 
        HookProc KeyBoardHookProcedure; 

        //键盘Hook结构函数 
        [StructLayout(LayoutKind.Sequential)] 
        public class KeyBoardHookStruct 
        { 
            public int vkCode; 
            public int scanCode; 
            public int flags; 
            public int time; 
            public int dwExtraInfo; 
        } 
        #region DllImport 
        //设置钩子 
        [DllImport("user32.dll")] 
        public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId); 
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
        //抽掉钩子 
        public static extern bool UnhookWindowsHookEx(int idHook); 
        [DllImport("user32.dll")] 
        //调用下一个钩子 
        public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam); 

        [DllImport("kernel32.dll")] 
        public static extern int GetCurrentThreadId(); 

        [DllImport("kernel32.dll")] 
        public static extern IntPtr GetModuleHandle(string name); 

        public void Hook_Start() 
        { 
            // 安装键盘钩子 
            if (hHook == 0) 
            { 
                KeyBoardHookProcedure = new HookProc(KeyBoardHookProc); 

                //hHook = SetWindowsHookEx(2, 
                //            KeyBoardHookProcedure, 
                //          GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), GetCurrentThreadId()); 

                hHook = SetWindowsHookEx(WH_KEYBOARD_LL, 
                          KeyBoardHookProcedure, 
                        GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0); 

                //如果设置钩子失败. 
                if (hHook == 0) 
                { 
                    Hook_Clear(); 
                    //throw new Exception("设置Hook失败!"); 
                } 
            } 
        } 

        //取消钩子事件 
        public void Hook_Clear() 
        { 
            bool retKeyboard = true; 
            if (hHook != 0) 
            { 
                retKeyboard = UnhookWindowsHookEx(hHook); 
                hHook = 0; 
            } 
            //如果去掉钩子失败. 
            if (!retKeyboard) throw new Exception("UnhookWindowsHookEx failed."); 
        } 

        //这里可以添加自己想要的信息处理 
        public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam) 
        { 
            if (nCode >= 0) 
            { 
                KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct)); 
                if (kbh.vkCode == 91)  // 截获左win(开始菜单键) 
                { 
                    return 1; 
                } 
                if (kbh.vkCode == 92)// 截获右win 
                { 
                    return 1; 
                } 
                if (kbh.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control) //截获Ctrl+Esc 
                { 
                    return 1; 
                } 
                if (kbh.vkCode == (int)Keys.F4 && (int)Control.ModifierKeys == (int)Keys.Alt)  //截获alt+f4 
                { 
                    return 1; 
                } 
                if (kbh.vkCode == (int)Keys.Tab && (int)Control.ModifierKeys == (int)Keys.Alt) //截获alt+tab 
                { 
                    return 1; 
                } 
                if (kbh.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Shift) //截获Ctrl+Shift+Esc 
                { 
                    return 1; 
                } 
                if (kbh.vkCode == (int)Keys.Space && (int)Control.ModifierKeys == (int)Keys.Alt)  //截获alt+空格 
                { 
                    return 1; 
                } 
                if (kbh.vkCode == 241)                  //截获F1 
                { 
                    return 1; 
                } 
                if ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt + (int)Keys.Delete)      //截获Ctrl+Alt+Delete 
                { 
                    return 1; 
                } 
                //if ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Shift)      //截获Ctrl+Shift 
                //{ 
                //    return 1; 
                //} 
              
                //if (kbh.vkCode == (int)Keys.Space && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt)  //截获Ctrl+Alt+空格 
                //{ 
                //    return 1; 
                //} 
            } 
            return CallNextHookEx(hHook, nCode, wParam, lParam); 
        } 

        #endregion 
 
    }
}
用32位编译运行的话,一到安装键盘钩子那一段方法就报错 也就是这个方法Hook_Start(),异常名是“未处理Win32Exception”,异常内容就是“操作成功完成。”
这该怎么改啊,我也是直接套用别人写好的钩子,也看不懂,在64位系统可以正常运行。 64位 32位 异常 C# 钩子
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,