最近在找键盘模拟的方式,最后在网上找到了一个WinIO.DLL的IO键盘模拟按键的方式。但是居然那个方法是有问题的。我造了全局的hook监视键盘信息,发现它只是有keyDown和keyPress的消息,keyUp的信息是up了一个zoom的键。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
public class WinIOLab
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private const int KBC_KEY_CMD = 0x64;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private const int KBC_KEY_DATA = 0x60;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[DllImport("winio.dll")]
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private static extern bool InitializeWinIo();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[DllImport("winio.dll")]
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private static extern bool GetPortVal(IntPtr wPortAddr, out int pdwPortVal, byte bSize);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[DllImport("winio.dll")]
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private static extern bool SetPortVal(uint wPortAddr, IntPtr dwPortVal, byte bSize);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[DllImport("winio.dll")]
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private static extern byte MapPhysToLin(byte pbPhysAddr, uint dwPhysSize, IntPtr PhysicalMemoryHandle);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[DllImport("winio.dll")]
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private static extern bool UnmapPhysicalMemory(IntPtr PhysicalMemoryHandle, byte pbLinAddr);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[DllImport("winio.dll")]
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private static extern bool GetPhysLong(IntPtr pbPhysAddr, byte pdwPhysVal);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[DllImport("winio.dll")]
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private static extern bool SetPhysLong(IntPtr pbPhysAddr, byte dwPhysVal);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[DllImport("winio.dll")]
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private static extern void ShutdownWinIo();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[DllImport("user32.dll")]
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private static extern int MapVirtualKey(uint Ucode, uint uMapType);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private WinIOLab()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
IsInitialize = true;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public static void Initialize()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if (InitializeWinIo())
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
KBCWait4IBE();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
IsInitialize = true;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public static void Shutdown()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if (IsInitialize)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ShutdownWinIo();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
IsInitialize = false;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
private static bool IsInitialize { get; set; }
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
///等待键盘缓冲区为空
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private static void KBCWait4IBE()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
int dwVal = 0;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
do
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
bool flag = GetPortVal((IntPtr)0x64, out dwVal, 1);
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
while ((dwVal & 0x2) > 0);
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/// 模拟键盘标按下
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public static void KeyDown(Keys vKeyCoad)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if (!IsInitialize) return;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
int btScancode = 0;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
btScancode = MapVirtualKey((uint)vKeyCoad, 0);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
KBCWait4IBE();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
KBCWait4IBE();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SetPortVal(KBC_KEY_DATA, (IntPtr)0x60, 1);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
KBCWait4IBE();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
KBCWait4IBE();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SetPortVal(KBC_KEY_DATA, (IntPtr)btScancode, 1);
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/// 模拟键盘弹出
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public static void KeyUp(Keys vKeyCoad)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if (!IsInitialize) return;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
int btScancode = 0;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
btScancode = MapVirtualKey((uint)vKeyCoad, 0);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
KBCWait4IBE();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
KBCWait4IBE();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SetPortVal(KBC_KEY_DATA, (IntPtr)0x60, 1);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
KBCWait4IBE();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
KBCWait4IBE();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SetPortVal(KBC_KEY_DATA, (IntPtr)(btScancode | 0x80), 1);
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
但是使用winIO.dll的办法在Win7 64x 上用不了的,根本注册不了驱动,不知有没有人研究得出解决办法。有的话请联系我:Anima.My@Gmail.com,谢谢。