64位下winio模拟键盘---亲测

准备:winio的两个文件 ,WinIO64.dll和WinIO64.sys。32位系统下的使用没有这么多道道,且网上很多成功例子,这里我就不多说。

1,第一点很重要,即将你的程序在vs中生成64位程序。

2,cmd下运行 bcdedit /set testsigning on

3,安装数字签名。步骤如下:

打开 WinIO64.sys的属性框,翻到“数字签名”选项卡,点击“详细信息”
在新出来的对话框中点击“查看证书”
在又新出来的对话框中点击“安装证书”
点击“下一步”,然后选择“将所有的证书放入下列存储”
点击浏览,选择“受信任的根证书发布机构”

点击“下一步”,然后点击“完成”

在弹出的“安全性警告”对话框中选择“是”,才能导入成功

然后重启。

4,相关代码。


namespace 模拟键盘
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

public const int KBC_KEY_CMD = 0x64;
public const int KBC_KEY_DATA = 0x60;


private const int VK_NUMLOCK = 0x90; //数字锁定键
private const int VK_SCROLL = 0x91; //滚动锁定
private const int VK_CAPITAL = 0x14; //大小写锁定
private const int VK_A = 65;
private const int VK_TAB = 9;
private const int VK_Delete = 46;
private const int VK_ENTER = 13;
private const int VK_END = 0x23;
private const int VK_BACK = 0x08;
private const int VK_SHIFT = 0x10;
private const int VK_RETURN = 0x0D;
private const int VK_ESCAPE = 0x1B;
[DllImport("WinIo64.dll")]
public static extern bool InitializeWinIo();
[DllImport("WinIo64.dll")]
public static extern bool GetPortVal(IntPtr wPortAddr, out int pdwPortVal, byte bSize);
[DllImport("WinIo64.dll")]
public static extern bool SetPortVal(uint wPortAddr, IntPtr dwPortVal, byte bSize);
[DllImport("WinIo64.dll")]
public static extern byte MapPhysToLin(byte pbPhysAddr, uint dwPhysSize, IntPtr PhysicalMemoryHandle);
[DllImport("WinIo64.dll")]
public static extern bool UnmapPhysicalMemory(IntPtr PhysicalMemoryHandle, byte pbLinAddr);
[DllImport("WinIo64.dll")]
public static extern bool GetPhysLong(IntPtr pbPhysAddr, byte pdwPhysVal);
[DllImport("WinIo64.dll")]
public static extern bool SetPhysLong(IntPtr pbPhysAddr, byte dwPhysVal);
[DllImport("WinIo64.dll")]
public static extern void ShutdownWinIo();


[DllImport("user32.dll")]
public static extern int MapVirtualKey(uint Ucode, uint uMapType);



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


public 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 MyKeyDown(int vKeyCoad)
{
if (!IsInitialize) return;


int btScancode = 0;
btScancode = MapVirtualKey((byte)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 MyKeyUp(int vKeyCoad)
{
if (!IsInitialize) return;


int btScancode = 0;
btScancode = MapVirtualKey((byte)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);// 写入按下键
}


private void Form1_Load(object sender, EventArgs e)
{
Initialize();
}


private void button1_Click(object sender, EventArgs e)//调用实例
{
textBox1.Focus();
MyKeyDown(66); // 按下A
Thread.Sleep(200);
MyKeyUp(66); // 松开A
Shutdown();
}

}
}

posted @ 2015-08-07 14:16  BetterCoder  阅读(15276)  评论(0编辑  收藏  举报