http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 20331|回复: 13

[其他] c#怎么做 驱动级模拟键盘

[复制链接]
发表于 2013-10-14 10:13:14 | 显示全部楼层 |阅读模式
c#怎么做 驱动级模拟键盘 我用keybd_event不行哦。




1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-10-14 10:22:42 | 显示全部楼层
我见风上有例子,还有Demo
http://www.csharpwin.com/csharpspace/3769r8779.shtml
 楼主| 发表于 2013-10-14 11:38:04 | 显示全部楼层
站长,有没有没有封装的直接调用WinIO.dll的代码?我只需要简单的功能。
 楼主| 发表于 2013-10-14 11:38:28 | 显示全部楼层
站长苏飞 发表于 2013-10-14 10:22
我见风上有例子,还有Demo
http://www.csharpwin.com/csharpspace/3769r8779.shtml

站长,有没有没有封装的直接调用WinIO.dll的代码?我只需要简单的功能。
发表于 2013-10-14 11:47:43 | 显示全部楼层
[code=csharp]
using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

namespace lizheAionWG

{

    public class WinIo

    {

        public const int KBC_KEY_CMD = 0x64;

        public const int KBC_KEY_DATA = 0x60;

        [DllImport("winio.dll")]

        public static extern bool InitializeWinIo();

        [DllImport("winio.dll")]

        public static extern bool GetPortVal(IntPtr wPortAddr, out int pdwPortVal, byte bSize);

        [DllImport("winio.dll")]

        public static extern bool SetPortVal(uint wPortAddr, IntPtr dwPortVal, byte bSize);

        [DllImport("winio.dll")]

        public static extern byte MapPhysToLin(byte pbPhysAddr, uint dwPhysSize, IntPtr PhysicalMemoryHandle);

        [DllImport("winio.dll")]

        public static extern bool UnmapPhysicalMemory(IntPtr PhysicalMemoryHandle, byte pbLinAddr);

        [DllImport("winio.dll")]

        public static extern bool GetPhysLong(IntPtr pbPhysAddr, byte pdwPhysVal);

        [DllImport("winio.dll")]

        public static extern bool SetPhysLong(IntPtr pbPhysAddr, byte dwPhysVal);

        [DllImport("winio.dll")]

        public static extern void ShutdownWinIo();

        [DllImport("user32.dll")]

        public static extern int MapVirtualKey(uint Ucode, uint uMapType);

        public void sendwinio()

        {

            if (InitializeWinIo())

            {

                KBCWait4IBE();

            }

        }

        ///Wait for Buffer gets empty

        private void KBCWait4IBE()

        {

            int dwVal = 0;

            do

            {

                bool flag = GetPortVal((IntPtr)0x64, out dwVal, 1);

            }

            while ((dwVal & 0x2) > 0);

        }

        /// key down

        public void MykeyDown(int vKeyCoad)

        {

            int btScancode = 0;

            btScancode = MapVirtualKey((byte)vKeyCoad, 0);

            KBCWait4IBE();

            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);

            KBCWait4IBE();

            SetPortVal(KBC_KEY_DATA, (IntPtr)0xe2, 1);

            KBCWait4IBE();

            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);

            KBCWait4IBE();

            SetPortVal(KBC_KEY_DATA, (IntPtr)btScancode, 1);

        }

        /// Key up

        public void MykeyUp(int vKeyCoad)

        {

            int btScancode = 0;

            btScancode = MapVirtualKey((byte)vKeyCoad, 0);

            KBCWait4IBE();

            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);

            KBCWait4IBE();

            SetPortVal(KBC_KEY_DATA, (IntPtr)0xe0, 1);

            KBCWait4IBE();

            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);

            KBCWait4IBE();

            SetPortVal(KBC_KEY_DATA, (IntPtr)btScancode, 1);

        }

        /// Simulate mouse down

        public void MyMouseDown(int vKeyCoad)

        {

            int btScancode = 0;

            btScancode = MapVirtualKey((byte)vKeyCoad, 0);

            KBCWait4IBE(); // 'wait for buffer gets empty

            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD3, 1);// 'send write command

            KBCWait4IBE();

            SetPortVal(KBC_KEY_DATA, (IntPtr)(btScancode | 0x80), 1);// 'write in io

        }

        /// Simulate mouse up

        public void MyMouseUp(int vKeyCoad)

        {

            int btScancode = 0;

            btScancode = MapVirtualKey((byte)vKeyCoad, 0);

            KBCWait4IBE(); // 'wait for buffer gets empty

            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD3, 1); //'send write command

            KBCWait4IBE();

            SetPortVal(KBC_KEY_DATA, (IntPtr)(btScancode | 0x80), 1);// 'write in io

        }

        //----------------------------------------------------------------------------------

        //VK codes

        //----------------------------------------------------------------------------------

        public enum Key

        {

            // mouse movements

            move = 0x0001,

            leftdown = 0x0002,

            leftup = 0x0004,

            rightdown = 0x0008,

            rightup = 0x0010,

            middledown = 0x0020,

            //keyboard stuff

            VK_LBUTTON = 1,

            VK_RBUTTON = 2,

            VK_CANCEL = 3,

            VK_MBUTTON = 4,

            VK_BACK = 8,

            VK_TAB = 9,

            VK_CLEAR = 12,

            VK_RETURN = 13,

            VK_SHIFT = 16,

            VK_CONTROL = 17,

            VK_MENU = 18,

            VK_PAUSE = 19,

            VK_CAPITAL = 20,

            VK_ESCAPE = 27,

            VK_SPACE = 32,

            VK_PRIOR = 33,

            VK_NEXT = 34,

            VK_END = 35,

            VK_HOME = 36,

            VK_LEFT = 37,

            VK_UP = 38,

            VK_RIGHT = 39,

            VK_DOWN = 40,

            VK_SELECT = 41,

            VK_PRINT = 42,

            VK_EXECUTE = 43,

            VK_SNAPSHOT = 44,

            VK_INSERT = 45,

            VK_DELETE = 46,

            VK_HELP = 47,

            VK_NUM0 = 48, //0

            VK_NUM1 = 49, //1

            VK_NUM2 = 50, //2

            VK_NUM3 = 51, //3

            VK_NUM4 = 52, //4

            VK_NUM5 = 53, //5

            VK_NUM6 = 54, //6

            VK_NUM7 = 55, //7

            VK_NUM8 = 56, //8

            VK_NUM9 = 57, //9

            VK_A = 65, //A

            VK_B = 66, //B

            VK_C = 67, //C

            VK_D = 68, //D

            VK_E = 69, //E

            VK_F = 70, //F

            VK_G = 71, //G

            VK_H = 72, //H

            VK_I = 73, //I

            VK_J = 74, //J

            VK_K = 75, //K

            VK_L = 76, //L

            VK_M = 77, //M

            VK_N = 78, //N

            VK_O = 79, //O

            VK_P = 80, //P

            VK_Q = 81, //Q

            VK_R = 82, //R

            VK_S = 83, //S

            VK_T = 84, //T

            VK_U = 85, //U

            VK_V = 86, //V

            VK_W = 87, //W

            VK_X = 88, //X

            VK_Y = 89, //Y

            VK_Z = 90, //Z

            VK_NUMPAD0 = 96, //0

            VK_NUMPAD1 = 97, //1

            VK_NUMPAD2 = 98, //2

            VK_NUMPAD3 = 99, //3

            VK_NUMPAD4 = 100, //4

            VK_NUMPAD5 = 101, //5

            VK_NUMPAD6 = 102, //6

            VK_NUMPAD7 = 103, //7

            VK_NUMPAD8 = 104, //8

            VK_NUMPAD9 = 105, //9

            VK_NULTIPLY = 106,

            VK_ADD = 107,

            VK_SEPARATOR = 108,

            VK_SUBTRACT = 109,

            VK_DECIMAL = 110,

            VK_DIVIDE = 111,

            VK_F1 = 112,

            VK_F2 = 113,

            VK_F3 = 114,

            VK_F4 = 115,

            VK_F5 = 116,

            VK_F6 = 117,

            VK_F7 = 118,

            VK_F8 = 119,

            VK_F9 = 120,

            VK_F10 = 121,

            VK_F11 = 122,

            VK_F12 = 123,

            VK_NUMLOCK = 144,

            VK_SCROLL = 145,

            middleup = 0x0040,

            xdown = 0x0080,

            xup = 0x0100,

            wheel = 0x0800,

            virtualdesk = 0x4000,

            absolute = 0x8000

        }

    }

}
[/code]
  1. InitSuperKeys() 安装WINIO驱动,一般用于Form_Load事件中调用
  2. CloseSuperKeys() 卸载WINIO驱动,一般用于Form_Closed事件中调用
  3. KeyDown(Key) 模拟普通Key键按下。
  4. KeyDownEx(Key)模拟扩展Key键按下。
  5. KeyUp(Key)模拟普通Key键弹起。
  6. KeyUpEx(Key)模拟扩展Key键弹起。
  7. KeyPress(Key)模拟普通Key键按下并弹起一次。其中按下和弹起的默认时间间隔是200毫秒
  8. KeyPress(Key,Int32)模拟普通Key键按下并弹起一次。其中按下和弹起的时间间隔是第二个参数,单位为毫秒。
  9. KeyPressEx(Key)模拟扩展按键Key按下并弹起一次。其中按下和弹起的默认时间间隔是200毫秒,写入扩展按键信息间隔时间为100毫秒
  10. KeyPressEx(Key,Int32)模拟扩展按键Key按下并弹起一次。其中按下和弹起的时间间隔是第二个参数,单位为毫秒,写入扩展按键信息间隔时间为100毫秒。
  11. KeyPressEx(Key,Int32,Int32)模拟扩展按键Key按下并弹起一次。其中按下和弹起的时间间隔是第二个参数,单位为毫秒,写入扩展按键信息间隔时间是第三个参数,单位为毫秒。
复制代码
WinIo.dll
WinIo.sys
需要将这两个文件放到debug下
Dll在这里
bin.rar (17.83 KB, 下载次数: 466)
发表于 2013-10-14 11:50:13 | 显示全部楼层
如果电脑是64位的我估计要换成WinIo64.dll才行,你可以测试下
发表于 2013-10-14 13:05:51 | 显示全部楼层
winring0
回复

使用道具 举报

 楼主| 发表于 2013-10-14 15:00:23 | 显示全部楼层
站长苏飞 发表于 2013-10-14 11:47
WinIo.dll
WinIo.sys
需要将这两个文件放到debug下

嗯,嗯。站长超厉害滴。谢谢站长!
发表于 2013-10-14 15:10:37 | 显示全部楼层
冰忆 发表于 2013-10-14 15:00
嗯,嗯。站长超厉害滴。谢谢站长!

呵呵别客气,有问题再交流,多上来支持下论坛哦
 楼主| 发表于 2013-10-14 15:33:23 | 显示全部楼层
站长苏飞 发表于 2013-10-14 11:50
如果电脑是64位的我估计要换成WinIo64.dll才行,你可以测试下

站长,是不是可以写成自己匹配32或者64.免得系统变化引起的不便?   

   IntPtr hMod;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // Check if this is a 32 bit or 64 bit system
            if (IntPtr.Size == 4)
            {
                hMod = LoadLibrary("WinIo32.dll");

            }
            else if (IntPtr.Size == 8)
            {
                hMod = LoadLibrary("WinIo64.dll");
            }

            if (hMod == IntPtr.Zero)
            {
                MessageBox.Show("Can't find WinIo dll.\nMake sure the WinIo library files are located in the same directory as your executable file.", "DumpPort", MessageBoxButtons.OK, MessageBoxIcon.Error);
                this.Close();
            }

            IntPtr pFunc = GetProcAddress(hMod, "InitializeWinIo");

            if (pFunc != IntPtr.Zero)
            {
                InitializeWinIoType InitializeWinIo = (InitializeWinIoType)Marshal.GetDelegateForFunctionPointer(pFunc, typeof(InitializeWinIoType));
                bool Result = InitializeWinIo();

                if (!Result)
                {
                    MessageBox.Show("Error returned from InitializeWinIo.\nMake sure you are running with administrative privileges and that the WinIo library files are located in the same directory as your executable file.", "DumpPort", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    FreeLibrary(hMod);
                    this.Close();
                }
            }

            btnGetValue_Click(this, null);
        }

WinIO32&WinIO64.rar

79 Bytes, 下载次数: 465, 下载积分: 金钱 -1

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-24 00:28

© 2014-2021

快速回复 返回顶部 返回列表