c#使用钩子拦截鼠标键盘事件

2023-11-02

窗体本身带的键盘鼠标事件函数只能响应窗体自己的事件,窗体之外的事件是不会响应的。比如当窗体最小化的时候也响应就要用全局钩子拦截消息来处理了。

大概过程就是在窗体初始化时加载钩子,等待事件消息,事件触发后调用响应函数处理。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;  //DllImport名空间
using System.Windows.Forms; //MouseEventHandler名空间
using System.Reflection; //Assembly名空间
using System.ComponentModel; //Win32Exception名空间
using System.Diagnostics;//PROCESS命名空间

namespace ShieldKeyBoardTouch
{
    class MouseKeyHook
    {
        [StructLayout(LayoutKind.Sequential)]
        private class POINT
        {
            public int x;
            public int y;
        }

        [StructLayout(LayoutKind.Sequential)]
        private class MouseHookStruct
        {
            public POINT pt;
            public int hwnd;
            public int wHitTestCode;
            public int dwExtraInfo;
        }

        [StructLayout(LayoutKind.Sequential)]
        private class MouseLLHookStruct
        {
            public POINT pt;
            public int mouseData;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }

        [StructLayout(LayoutKind.Sequential)]
        private class KeyboardHookStruct
        {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }
        [DllImport("user32.dll", CharSet = CharSet.Auto,  CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        private static extern int SetWindowsHookEx(  int idHook,  HookProc lpfn,   IntPtr hMod,  int dwThreadId);

        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        private static extern int UnhookWindowsHookEx(int idHook);

        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        private static extern int CallNextHookEx(  int idHook,  int nCode, int wParam,  IntPtr lParam);

        private delegate int HookProc(int nCode, int wParam, IntPtr lParam);

        [DllImport("user32")]
        private static extern int ToAscii(  int uVirtKey,  int uScanCode,  byte[] lpbKeyState,   byte[] lpwTransKey,   int fuState);

        [DllImport("user32")]
        private static extern int GetKeyboardState(byte[] pbKeyState);

        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        private static extern short GetKeyState(int vKey);

        [DllImport("kernel32.dll", EntryPoint = "GetModuleHandleA", SetLastError = true, CharSet = CharSet.Ansi, ThrowOnUnmappableChar = true)]
        public static extern IntPtr GetModuleHandleA(String lpModuleName);

        [DllImport("kernel32.dll", EntryPoint = "GetModuleHandleW", SetLastError = true, CharSet = CharSet.Unicode, ThrowOnUnmappableChar = true)]
        public static extern IntPtr GetModuleHandleW(String lpModuleName);



        //消息参数的值
        private const int WH_MOUSE_LL = 14;
        private const int WH_KEYBOARD_LL = 13;
        private const int WH_MOUSE = 7;
        private const int WH_KEYBOARD = 2;
        private const int WM_MOUSEMOVE = 0x200;
        private const int WM_LBUTTONDOWN = 0x201;
        private const int WM_RBUTTONDOWN = 0x204;
        private const int WM_MBUTTONDOWN = 0x207;
        private const int WM_LBUTTONUP = 0x202;
        private const int WM_RBUTTONUP = 0x205;
        private const int WM_MBUTTONUP = 0x208;
        private const int WM_LBUTTONDBLCLK = 0x203;
        private const int WM_RBUTTONDBLCLK = 0x206;
        private const int WM_MBUTTONDBLCLK = 0x209;
        private const int WM_MOUSEWHEEL = 0x020A;

        private const int WM_KEYDOWN = 0x100;
        private const int WM_KEYUP = 0x101;
        private const int WM_SYSKEYDOWN = 0x104;
        private const int WM_SYSKEYUP = 0x105;

        private const byte VK_SHIFT = 0x10;
        private const byte VK_CAPITAL = 0x14;
        private const byte VK_NUMLOCK = 0x90;

        public MouseKeyHook()
        {
            Start();
        }
        public MouseKeyHook(bool InstallMouseHook, bool InstallKeyboardHook)
        {
            Start(InstallMouseHook, InstallKeyboardHook);
        }

        ~MouseKeyHook()
        {
            Stop(true, true, false);
        }

        public event MouseEventHandler OnMouseActivity; //MouseEventHandler是委托,表示处理窗体、控件或其他组件的 MouseDown、MouseUp 或 MouseMove 事件的方法。
        public event KeyEventHandler KeyDown;
        public event KeyPressEventHandler KeyPress;
        public event KeyEventHandler KeyUp;

        private int hMouseHook = 0; //标记mouse hook是否安装
        private int hKeyboardHook = 0;

        private static HookProc MouseHookProcedure;
        private static HookProc KeyboardHookProcedure;

        //---------------------------------------------------------------------------
        public void Start()
        {
            this.Start(true, true);
        }

        public void Start(bool InstallMouseHook, bool InstallKeyboardHook)
        {
               IntPtr HM = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]);
               
               if (hMouseHook == 0 && InstallMouseHook)
                {
                        MouseHookProcedure = new HookProc(MouseHookProc);//钩子的处理函数
                        hMouseHook = SetWindowsHookEx(
                                WH_MOUSE_LL,
                                MouseHookProcedure,
                                GetModuleHandleW(Process.GetCurrentProcess().MainModule.ModuleName),//本进程模块句柄
                                0);
                        if (hMouseHook == 0)
                        {
                                int errorCode = Marshal.GetLastWin32Error();
                                Stop(true, false, false);
                                throw new Win32Exception(errorCode);
                        }
                }

            if (hKeyboardHook == 0 && InstallKeyboardHook)
            {
                    KeyboardHookProcedure = new HookProc(KeyboardHookProc);
                    hKeyboardHook = SetWindowsHookEx(
                            WH_KEYBOARD_LL,
                            KeyboardHookProcedure,
                            //Marshal.GetHINSTANCE( Assembly.GetExecutingAssembly().GetModules()[0]),
                            GetModuleHandleW(Process.GetCurrentProcess().MainModule.ModuleName),
                            0);
                    if (hKeyboardHook == 0)
                    {
                            int errorCode = Marshal.GetLastWin32Error();
                            Stop(false, true, false);
                            throw new Win32Exception(errorCode);
                    }
            }
        }
        //-------------------------------------------------
        public void Stop()
        {
            this.Stop(true, true, true);
        }

        public void Stop(bool UninstallMouseHook, bool UninstallKeyboardHook, bool ThrowExceptions)
        {
                if (hMouseHook != 0 && UninstallMouseHook)
                {
                        int retMouse = UnhookWindowsHookEx(hMouseHook);
                        hMouseHook = 0;
                        if (retMouse == 0 && ThrowExceptions)
                        {
                                int errorCode = Marshal.GetLastWin32Error();
                                throw new Win32Exception(errorCode);
                        }
                }

                if (hKeyboardHook != 0 && UninstallKeyboardHook)
                {
                        int retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
                        hKeyboardHook = 0;
                        if (retKeyboard == 0 && ThrowExceptions)
                        {
                                int errorCode = Marshal.GetLastWin32Error();
                                throw new Win32Exception(errorCode);
                        }
                }
        }
        //-------------------------------------------------------------------------------

        private int MouseHookProc(int nCode, int wParam, IntPtr lParam)
        {
                if ((nCode >= 0) && (OnMouseActivity != null))
                {
                    MouseLLHookStruct mouseHookStruct = (MouseLLHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseLLHookStruct));

                    MouseButtons button = MouseButtons.None;
                    short mouseDelta = 0;
                    int clickCount = 0;
                    switch (wParam)
                    {
                        case WM_LBUTTONDOWN://513出现了
                            button = MouseButtons.Left;
                            clickCount = 1;
                            break;
                        case WM_RBUTTONDOWN://516出现了
                            button = MouseButtons.Right;
                            clickCount = 1;
                            break;
                        case WM_LBUTTONDBLCLK://515  doubleclick没有出现过
                            button = MouseButtons.XButton1;
                            clickCount = 2;
                            break;
                        case WM_RBUTTONDBLCLK://518
                            button = MouseButtons.XButton1;
                            clickCount = 2;
                            break;
                        case WM_MOUSEMOVE://512 出现了
                            button = MouseButtons.XButton2;
                            clickCount = 0;
                            break;
                        case WM_MOUSEWHEEL://522 没试
                            mouseDelta = (short)((mouseHookStruct.mouseData >> 16) & 0xffff);
                            clickCount = 0;
                            break;
                    }                

                    MouseEventArgs e = new MouseEventArgs(
                                                       button,
                                                       clickCount,
                                                       mouseHookStruct.pt.x,
                                                       mouseHookStruct.pt.y,
                                                       mouseDelta);
                    OnMouseActivity(this, e);//转给委托函数
                }
                return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
        }
        //------------------------------------------------------------------------------------
        private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
        {
            bool handled = false;
            if ((nCode >= 0) && (KeyDown != null || KeyUp != null || KeyPress != null))
            {
                KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
                if (KeyDown != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
                {
                    Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
                    KeyEventArgs e = new KeyEventArgs(keyData);
                    KeyDown(this, e);               //转给委托函数
                    handled = handled || e.Handled;
                }

                if (KeyPress != null && wParam == WM_KEYDOWN)
                {
                    bool isDownShift = ((GetKeyState(VK_SHIFT) & 0x80) == 0x80 ? true : false);
                    bool isDownCapslock = (GetKeyState(VK_CAPITAL) != 0 ? true : false);

                    byte[] keyState = new byte[256];
                    GetKeyboardState(keyState);
                    byte[] inBuffer = new byte[2];
                    if (ToAscii(MyKeyboardHookStruct.vkCode,
                              MyKeyboardHookStruct.scanCode,
                              keyState,
                              inBuffer,
                              MyKeyboardHookStruct.flags) == 1)
                    {
                        char key = (char)inBuffer[0];
                        if ((isDownCapslock ^ isDownShift) && Char.IsLetter(key)) key = Char.ToUpper(key);
                        KeyPressEventArgs e = new KeyPressEventArgs(key);
                        KeyPress(this, e);
                        handled = handled || e.Handled;
                    }
                }

                if (KeyUp != null && (wParam == WM_KEYUP || wParam == WM_SYSKEYUP))
                {
                    Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
                    KeyEventArgs e = new KeyEventArgs(keyData);
                    KeyUp(this, e);
                    handled = handled || e.Handled;
                }

            }

            if (handled)
                return 1;
            else
                return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
        }


    }
}

这个类是用来加载钩子的,然后在窗体中定义委托函数,我只用了keydown和OnMouseActivity,让窗体本身的事件相应函数来处理它们。也可以自己另外写函数处理

 public partial class Form1 : Form
 {
         private MouseKeyHook mouseKeyHook1 = new MouseKeyHook(true,true);//鼠标,键盘
         public Form1()
        {
                InitializeComponent();
                
                mouseKeyHook1.KeyDown += new KeyEventHandler(Form1_KeyDown);
                //mouseKeyHook1.KeyPress += new KeyPressEventHandler(mouseKeyHook1_KeyPress);
                //mouseKeyHook1.KeyUp += new KeyEventHandler(mouseKeyHook1_KeyUp);
                mouseKeyHook1.OnMouseActivity += new MouseEventHandler(Form1_MouseDown);
        }
}

 private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
           //MessageBox.Show("key down ", "message:", MessageBoxButtons.OK);
            LogFileCotent = LogFileCotent + "key down at :  " + DateTime.Now.ToString() + "   fail\r\n";
            textBox1.AppendText("key down at :  " + DateTime.Now.ToString());
            textBox1.AppendText(Environment.NewLine);
        }

还有一个问题就是鼠标消息其实没有出现DOUBECLICK的值 ,原因应该也是click在前面被它取代了。解决的办法是利用timer计时两次click时间差,功能得自己写。







本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c#使用钩子拦截鼠标键盘事件 的相关文章

  • 软件开发中几个常用功能的实现

    软件开发中几个常用功能的实现 出处 vchelp net责任编辑 leelee 04 8 12 10 01 作者 戚高 在进行软件开发过程中间 有很多小功能的实现 虽然这些东西你可以不用 但是如果应用仂将会是你的程序更具有专业性 一 设置程
  • 自定义C++异常处理

    例1 自定义一个继承自excepton的异常类myException C 标准中 定义在
  • VC6添加自定义消息(主窗口向子窗口发送消息)

    从主窗口向子窗口发送消息 可以在子窗口中添加自定义的消息 然后在主窗口中需要地方呼叫该消息 呼叫方法 1 将子窗口添加为主窗口的成员变量 2 主窗口呼叫该消息 成员变量名 SendMessage UM PROGRESS 子窗口添加自定义消息
  • VC++ 教程

    基本概念 对象 面向对象编程2 定义实体后 可以不知道此实体的功能是怎样实现的 也能使用它们 核心概念 1 数据封装 将一个数据与这个数据有关的操作集合封装在一起 形成一个能动的实体 称为对象 2 继承 在面向对象语言中 类功能支持层次机制
  • vc++ 如何使radio button ,checkbox初始为已选状态?

    CheckDlgButton IDC CHECK1 BST UNCHECKED 0 CheckDlgButton IDC CHECK2 BST CHECKED 1 CButton GetDlgItem IDC RADIO 1 gt SetC
  • VC ini配置文件常用操作

    A 读写ini文件 ini文件 即Initialization file 这种类型的文件中通常存放的是一个程序的初始化信息 ini文件由若干个节 Section 组成 每个Section由若干键 Key 组成 每个Key可以赋相应的值 读写
  • Silicon Labs CP210x USB to UART Bridge,COM口无法识别

    一直用一个电脑端 识别USB转串口的函数接口 但在Silicon Labs CP210x USB to UART Bridge上 却无法成功识别 确认过Silicon Labs CP210x USB to UART Bridge和Proli
  • vs 查看 C++ #define 宏定义展开代码

    方法一 define 通常是代码的展开 如果是 复杂 的 define 如何直观的查看展开效果 在 vs 中 选中需要查看的 cpp 文件 右键属性 预处理器 预处理到文件 选择是 确定 右键 cpp 文件 编译 debug 目录中会有一个
  • 第七讲:构造函数与析构函数

    第七讲 构造函数与析构函数 本讲基本要求 掌握 构造和析构函数概念 初始化 作用 理解 构造构函的重载 带参数的构造函数两种表达格式 重点 难点 构造和析构函数概念 初始化 作用 通过前两章的学习 我们已经对类和对象有了初步的了解 在本章中
  • VC++、MFC中最好的开源项目

    介绍一下用VC MFC写的最好的开源项目 Sourceforge net中有许多高质量的VC 开源项目 我列举了一些可以作为VC 程序员的参考 一 优秀的开源项目 7 Zip http sourceforge net projects se
  • LNK2005: _DllMain@12 already defined in LIBCMTD.lib(dllmain.obj)

    今天使用VS2003创建一个MFC 的dll工程时 出现以下错误 VPR error LNK2005 DllMain 12 already defined in LIBCMTD lib dllmain obj VPR error LNK20
  • Error:fatal error C1010: unexpected end of file while looking for precompiled head

    场景 在VC6 0进行编写C 代码时 创建了一个 简单的程序 s 然后编译就爆出这个错误 场景复现 创建流程 点击左上角的 文件 然后点击 新建 在左上方选择工程 然后下方选择 Win32 Console Application 在右侧填写
  • VS2010 LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 的解决方法

    因为同一个电脑上安装多个VS 有多个cvtres exe 按照下面的操作如果还是不行就在C盘搜索cvtres exe 然后挨个重命名 看看是调用的哪个 然后修改就可以了 用VS2010编译C 项目时出现这样的错误 LNK1123 转换到 C
  • vc中如何获取打开文件名

    在编制程序的过程中 很多时候我们需要从外部存储器中获取文件名 如果你知道文件路径 那很容易解决 但是不知道文件路径的话 怎么办呢 其实答案地球人都知道 那就是vc提供的 打开文件对话方块 怎么使用它呢 请看代码 include
  • #pragma data_seg共享数据使用说明

    用 pragma data seg建立一个新的数据段并定义共享数据 其具体格式为 pragma data seg shareddata HWND sharedwnd NULL 共享数据 pragma data seg 1 pragma da
  • 如何去掉去掉VC++的安全警告提示

    在用Vc进行进程编写时 你有可能会遇到一大堆的警告 warning C4996 如 warning C4996 This function or variable may be unsafe 原因是VC使用了更加安全的run time li
  • VS2005(VC++)远程调试方法

    仅我目前了解很多人还在使用成本很高的本地调试方法 即在需要调试的机器上安装VS环境 这样的好处就是直接 但是成本很高 要在目标机器安装一个VS的Copy 国内可能不是问题 还有源代码安全问题 同步问题等等 开始 已知 A B两个服务器 如果
  • 如何编译火狐浏览器的源代码

    以下摘录于 http zhidao baidu com question 33214960 html 源代码编译安装Firefox linux下 http forums mozine cn index php showtopic 601 W
  • "无法找到“XXX.exe”的调试信息,或者调试信息不匹配

    今天调试一C 程序 按下F5 老是弹出一对话框显示信息 debugging information for myproject exe cannot be found or does not match No symbols loaded
  • 系统托盘区句柄研究和C#基本托盘编程

    因为我的系统托盘区小图标有时候会不可见 在还是在 研究一下系统托盘区的句柄 是否每个小图标是一个单个窗口 就像form的button一样 下图句柄工具 把问号拖动到窗口上 就会显示该窗口的句柄和窗口类等信息 拖到系统托盘区看一下 拖到任何一

随机推荐

  • 使用R语言计算DataFrame数据中指定范围多个数据列的两两相关系数

    使用R语言计算DataFrame数据中指定范围多个数据列的两两相关系数 在数据分析和统计建模中 了解数据列之间的相关性是非常重要的 R语言提供了许多函数来计算数据集中数据列之间的相关系数 本文将介绍如何使用R语言中的cor函数来计算Data
  • Hadoop的shuffle原理和过程图解

    wordcount为例详细阐述shuffle的实现过程 1 对HDFS输入的文件进行切割为KV形式 2 在mapper方法中执行 分割单词为KV形式 3 shuffle在Map端的三个操作 partition 多节点的相同K合并 sort
  • OpenCv中计算图像像素最大值、最小值、均值和方差

    1 寻找图像像素的最大值最小值 寻找图像最大值最小值的函数 minMaxLoc 函数 minMaxLoc 函数原型 void cv minMaxLoc InputArray src double minVal double maxVal 0
  • 浮点数——科学计数法、浮点数表示、加减运算和浮点数的使用

    目录 1 2浮点数 1 2 1 科学计数法 1 2 2 浮点数表示 1 符号位 2价码位 1 2 3 加减运算 1 2 4 浮点数的使用 1 2浮点数 浮点数是采用科学计数法来表示的 由符号位 有效数字 指数三部分组成 使用浮点数存储和计算
  • 性能测试------LoadRunner

    1 常见的性能问题 1 内存泄漏 软件运行的时候没有回收内存 导致内存越来越慢 2 CPU使用率达到了100 3 线程死锁 阻塞 造成系统运行越来越慢 4 查询的速度越来越慢 5 受外部系统的影响越来越大 2 为什么要进行性能测试 1 获取
  • three.js源码翻译及案例(五)-GLTFLoader.js

    写在前面 Three中的加载脚本很多 但是核心思想是差不多的 就是文件用文件解析器加载 图片用图片解析器加载 然后json转换为对象 但是由于gltf格式可以自己编辑所以有的源码参考意义不大 glb及拓展材质都没用上就还没有翻译 以后可能会
  • xcode APP 打包以及提交apple审核详细流程(新版本更新提交审核)

    最近项目到了最后的阶段 测试完一切ok后 准备打包以及提交 不料看到网上众教程 好多都是老版本的 现在IDE实现方式改了 那些方法好多都找不到 绕了一大圈 才搞明白流程 现在记录下来 以便朋友们查阅 开发环境 xcode4 4 1 ipho
  • 李胜溢9.5 : 最新黄金原油行情走势分析及布局操作指南。

    趋势价值交易 是所有投资者走向盈利的必经之路 没有捷径 也不要心存侥幸 任何一个投资者从初入市场 到走向盈利 都需要经历亏损再到保本再到盈利的过程 市场绝对不是投机者长久的天堂 一次的投机成功不代表可以善始善终 只有稳定不断的持续盈利才能成
  • pytorch seq2seq+attention机器翻译注

    准备深入学习一下神经网络的搭建方法的时候 选了机器翻译来试试 正好查了很多资料 发现pytorch里有例子 就结合自己的理解和探究记录一下 原文实现代码 https pytorch org tutorials intermediate se
  • Android Studio方法红色的解决办法

    前言 本人一共经历过以下几种飘红的情景 一 复制代码 很多方法的包没有导进来 这就是android studio和eclipse的差别 解决方法有两种 1 点击红色的方法 然后ALT Enter Import class 即可完成导入 2
  • Git错误non-fast-forward的解决方法

    目录 1 问题描述 2 分析问题 3 解决问题 3 1 先合并之前的历史 再进行提交 提倡使用 3 2 丢弃之前的历史 强推 谨慎使用 1 问题描述 当要push代码到git时 出现提示 git push origin master To
  • 数据库入门(SQL SEVER)之SQL语句删除单行数据,所有行数据,表和数据库

    1 删除单行数据 2 删除所有行数据 3 删除表和数据库 一 在该页面上直接单击右键选择删除 1 2选择 数据库 gt SSMSTest gt 表 右键单击直接删除整个表 连带着数据也删除了 不过要注意表有没有外键约束 有的话不能删除主表
  • 在windows和linux上传或下载文件

    一 使用xshell在windows和linux上传或下载文件 有个很简单的方法就是rz sz 1 工具安装 需要安装工具 yum install lrzsz 使用工具 安装的rz sz就是Linux Unix同Windows进行文件传输的
  • 关于解决VC运行C语言程序闪退的问题

    关于解决VS运行C语言程序闪退的问题 最近使用VS2017调试C语言控制台程序 一直出现程序正常运行结束就闪退 看不到控制台的的运行结果 经过查资料尝试 得到几种解决方法 1 在return 0 前加上getchar 利用getchar 函
  • K-最近邻法(KNN)简介

    K 最近邻法 K Nearest Neighbor KNN 最初由Cover和Hart于1968年提出 是一个在理论上比较成熟的分类算法 KNN是一类可用于分类或回归的技术 作为一个非参数学习算法 K 最近邻并不局限于固定数目的参数 我们通
  • ubuntu 22.04 国内镜像阿里云/163源/清华大学/中科大--转--已验证

    Ubuntu 22 04 LTS 五年长期支持版本 直到2027年4月 1 备份原配置 sudo cp etc apt sources list etc apt sources list bak 2 清华大学镜像 复制以下命令即可一键切换到
  • 深入 AXI4总线 (四):RAM 读取实战

    光说不练 云玩家 这篇文章中我们就通过访问一个 AXI4 接口的 RAM 的实际操作 加深我们对 AXI4 总线的理解 我们的实验平台是 ISE 14 7 以及 modelsim 10 2 RAM 的 ip 使用 ISE 的 block m
  • flex阶段总结

    关于从XML中读取到的中英文乱码 在flex应用程序中加入语句 flash system System useCodePage true 处理中文乱码 日期格式的修改 var datefamate DateFormatter new Dat
  • Logminer简介及应用

    背景 近期在研究OGG复制时 对于官方稳定中提到了11 2 0 4及以后的数据库出现了一种新的捕获日志的方法 integrated capture mode 该方法使用Log Mining Server捕获日志 故对于LogMiner进行了
  • c#使用钩子拦截鼠标键盘事件

    窗体本身带的键盘鼠标事件函数只能响应窗体自己的事件 窗体之外的事件是不会响应的 比如当窗体最小化的时候也响应就要用全局钩子拦截消息来处理了 大概过程就是在窗体初始化时加载钩子 等待事件消息 事件触发后调用响应函数处理 using Syste