C#中使用WinIO模拟键盘鼠标(转)

原文地址在哪忘了,对不起额。

  public class WinIOLab
    {
        private const int KBC_KEY_CMD = 0x64;
        private const int KBC_KEY_DATA = 0x60;
        [DllImport("winio32.dll")]
        private static extern bool InitializeWinIo();
        [DllImport("winio32.dll")]
        private static extern bool GetPortVal(IntPtr wPortAddr, out int pdwPortVal, byte bSize);
        [DllImport("winio32.dll")]
        private static extern bool SetPortVal(uint wPortAddr, IntPtr dwPortVal, byte bSize);
        [DllImport("winio32.dll")]
        private static extern byte MapPhysToLin(byte pbPhysAddr, uint dwPhysSize, IntPtr PhysicalMemoryHandle);
        [DllImport("winio32.dll")]
        private static extern bool UnmapPhysicalMemory(IntPtr PhysicalMemoryHandle, byte pbLinAddr);
        [DllImport("winio32.dll")]
        private static extern bool GetPhysLong(IntPtr pbPhysAddr, byte pdwPhysVal);
        [DllImport("winio32.dll")]
        private static extern bool SetPhysLong(IntPtr pbPhysAddr, byte dwPhysVal);
        [DllImport("winio32.dll")]
        private static extern void ShutdownWinIo();
        [DllImport("user32.dll")]
        private static extern int MapVirtualKey(uint Ucode, uint uMapType);

        private WinIOLab()
        {
            IsInitialize = true;
        }
        public static void Initialize()
        {
            if (InitializeWinIo())
            {
                KBCWait4IBE();
                IsInitialize = true;
            }
        }
        public static void Shutdown()
        {
            if (IsInitialize)
                ShutdownWinIo();
            IsInitialize = false;
        }

        private static bool IsInitialize { get; set; }

        ///等待键盘缓冲区为空
        private static void KBCWait4IBE()
        {
            int dwVal = 0;
            do
            {
                bool flag = GetPortVal((IntPtr)0x64, out dwVal, 1);
            }
            while ((dwVal & 0x2) > 0);
        }
        /// 模拟键盘标按下
        public static void KeyDown(Keys vKeyCoad)
        {
            if (!IsInitialize) return;

            int btScancode = 0;
            btScancode = MapVirtualKey((uint)vKeyCoad, 0);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)0x60, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)btScancode, 1);
        }
        /// 模拟键盘弹出
        public static void KeyUp(Keys vKeyCoad)
        {
            if (!IsInitialize) return;

            int btScancode = 0;
            btScancode = MapVirtualKey((uint)vKeyCoad, 0);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)0x60, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)(btScancode | 0x80), 1);
        }
    }

 

调用

 WinIOLab.Initialize(); // 注册
 WinIOLab.KeyDown(Keys.A); // 按下A
 WinIOLab.KeyUp(Keys.A); // 松开A
 WinIOLab.Shutdown(); // 用完后注销

 

 

时间: 2024-08-02 19:32:41

C#中使用WinIO模拟键盘鼠标(转)的相关文章

浅析Android 模拟键盘鼠标事件

通过Socket + Instrumentation实现模拟键盘鼠标事件主要通过以下三个部分组成:Socket编程:实现PC和Emulator通讯,并进行循环监听Service服务:将Socket的监听程序放在Service中,从而达到后台运行的目的.这里要说明的是启动服务有两种方式,bindService和startService,两者的区别是,前者会使启动的Service随着启动Service的Activity的消亡而消亡,而startService则不会这样,除非显式调用stopServi

模拟键盘-怎么在webbrowser中在鼠标点击的位置处得到焦点

问题描述 怎么在webbrowser中在鼠标点击的位置处得到焦点 我在webbrowser中载入淘宝界面,在搜索框处进行了模拟鼠标点击,我想在搜索框处获取焦点,然后模拟键盘输入文字.关键是焦点怎么获得.它不是控件,不能用this.控件.focus. 解决方案 我没试过,你看下面可以吗? 我的思路: 给文本框加载一个KeyPress事件,(例:enter事件) private void enter(object sender, KeyPressEventArgs e) { if (e.KeyCha

关于用VS2013 C# 开发 检测屏幕颜色变化 然后模拟控制鼠标键盘程序

问题描述 我想用VS2013C#开发检测屏幕颜色变化然后模拟控制鼠标键盘程序,程序功能就如"按键精灵"做出来的程序一样请问要学会那些知识点呀?这个难度高吗? 解决方案 解决方案二:不高,懂点api最好解决方案三:这个主要是算法吧..C#里是有办法获取屏幕上的像素点的

VB键盘鼠标无动作调用程序的尝试_vb

我想要实现的功能是,当键盘无输入.鼠标无移动或点击动作时调用程序.首先想到的是用钩子HOOK来获取键盘或者鼠标的动作,如果无动作时调用程序.我尝试的结果是HOOK来HOOK去总是有问题. 后来想到Windows的屏幕保护程序就是当键盘鼠标无动作时进入屏幕保护的,于是改变思路,想把程序做成这样的形式,键盘鼠标无动作,系统进入屏幕保护,然后检测系统是否运行屏幕保护程序,如果运行的话则调用程序.这种方式就是以屏幕保护程序作为中介,把检测键盘鼠标动作的工作交给屏幕保护程序来完成了.SystemParam

SendInput模拟键盘输入的问题 <转>

最近接触到这个函数,因此了解了一下,总结一下列在这. 我了解它的出发点是如何通过它向活动窗口输入字符,这是很多程序都有的功能(我猜Visual Assist X就用了这个功能). 根据MSDN,此函数模拟按键操作,将一些消息插入键盘或鼠标的输入流中,Windows对它进行处理,生成相应的WM_KEYDOWN或WM_KEYUP事件,这些事件与普通键盘输入一起进入应用程序的消息循环,它们不仅可以转换为WM_CHAR消息,还可以转换为其它(诸如加速键)等消息. 使用它来发送字符消息,并没有看起来那么简

【转载】synergy在Windows和Linux下使用全攻略(多台PC共享一套键盘鼠标)

synergy-project.org/nightlysyn 本攻略中介绍的是双机键盘鼠标共享,多机情况类似,学会双机的,其他情况自然就会了.     在工作中,有一台笔记本和一台个人PC,个人PC的键盘鼠标都相当难用,遂希望能找到一个能让我使用笔记本键盘和鼠标能直接实时操作另一台PC的办法,不负所望,发现了synergy这款软件.这款软件的好处在于:它可以跨操作系统使用,只要你的多台电脑是通过网络连接,在同一个网段(不同网段没有试验过),并且支持TCP/IP协议,那都可以轻松实现多台电脑的共享

VB.NET全局键盘鼠标钩子[Vb.Net Hook](修正版)

原文有些BUG,因为这是段我从C#中转换而来的代码,所在最初的转换中因为两种语言的性质不同,所以无法完全兼容一些特性. 当然,现在的我已经完全有能力兼容两种语言的特性了,所以就重写了本段代码,将原代码中的事件检测,以及原代码中的KeyPress 时间无法检测输入字符大小写的BUG消除(在此感谢verywzm 同志) . 注意:本段代码如果想要在VS中运行,请将[工程属性] - [调试] - [启动 Visual Studio 宿主进程 ] 设置的勾去掉,或者使用 CTRL+F5 进行编译后调试!

Delphi建键盘鼠标动作纪录与回放

Windows提供API函数SetwindowsHookEx来建立一个Hook,通过这个函数可以将一个程序添加到Hook链中监视Windows 消息,函数语法为: SetWindowsHookEx(idHook: Integer; lpfn: TFNHookProc; hmod: HINST; dwThreadId: DWORD) 其中参数idHook指定建立的监视函数类型. 通过Windows MSDN帮助可以看到,SetwindowsHookEx函数提供15种不同 的消息监视类型,在这里我们

用应用程序模拟键盘和鼠标按键

本文配套源码 在Windows大行其道的今天,windows界面程序受到广大用户的欢迎.对这些程序的操作不外乎两种,键盘输入控制和鼠标输入控制.有时,对于繁杂的,或重复性的输入操作,我们能否通过编制程序来代替手工输入,而用程序来模拟键盘及鼠标的输入呢?答案是肯定的.这里主要是通过两个Windows API函数来实现的.下面以VC++为例来介绍一下如何实现这两个功能. 模拟键盘我们用Keybd_event这个api函数,模拟鼠标按键用mouse_event函数.在VC里调用api函数是 既简单又方