有没有人做过WinIo,请问一下如何模拟按键按下不抬起。

u011021100 2016-09-10 03:24:34
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
WinIo.Initialize();
timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
WinIo.KeyDown(Keys.R);
WinIo.KeyUp(Keys.R);
}

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
WinIo.Shutdown();
}

上面那段代码会一直模拟R键按下,但是当我把WinIo.KeyUp(Keys.R);这句注释掉之后,发现依旧是同样的效果。
难道WinIo.KeyDown还会自动抬起吗?怎样写才能模拟R键一直按下不抬起呢?


WinIo类如下,用的是 WinIo3.0
class WinIo
{
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 WinIo()
{
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);
}
}
...全文
207 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
u011021100 2016-09-13
  • 打赏
  • 举报
回复
加分顶一下。
u011021100 2016-09-12
  • 打赏
  • 举报
回复
有没人大神啊,三天了,顶一下。
u011021100 2016-09-12
  • 打赏
  • 举报
回复
求大神啊,这个问题一直没解决。。AT_TA

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧