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();
}

}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM