http://topic.csdn.net/u/20080413/14/8b9d2234-53c3-497a-ba74-9f5df6347fc6.html
C#中winio.dll模拟鼠标问题。
我的操作系统是XP。
以下是我的代码:
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();
}
}
public void closewinio()
{
//关闭WinIO
ShutdownWinIo();
KBCWait4IBE();
}
///等待键盘缓冲区为空
private void KBCWait4IBE()
{
int dwVal = 0;
do
{
bool flag = GetPortVal((IntPtr)0x64, out dwVal, 1);
}
while ((dwVal & 0x2) > 0);
}
/// 模拟键盘标按下
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);// '写入按下键
}
/// 模拟键盘弹出
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);// '写入释放键
}
//这个用来模拟按下键,参数vKeyCoad传入按键的虚拟码
public void MyMouse(int vKeyCoad)
{
int btScancode = 0;
btScancode = MapVirtualKey((byte)vKeyCoad, 0);
btScancode = vKeyCoad;
KBCWait4IBE(); // '发送数据前应该先等待键盘缓冲区为空
SetPortVal(KBC_KEY_CMD, (IntPtr)0xD3, 1);// '发送键盘写入命令
//SetPortVal函数用于向端口写入数据,它的用法是SetPortVal 端口号,欲写入的数据,写入数据的长度
KBCWait4IBE();
SetPortVal(KBC_KEY_DATA, (IntPtr)btScancode, 1);// '写入按键信息,按下键
}
}
//////////然后在程序中用到WINIO//////////////////
private void btnStart_Click(object sender, EventArgs e)
{
WinIo kk = new WinIo();
// IntPtr a = new IntPtr();
kk.sendwinio();
System.Threading.Thread.Sleep(5000);
kk.MykeyDown(112); //发送F1键按下
System.Threading.Thread.Sleep(500);
kk.MykeyUp(112); //发送F1键弹起
kk.MyMouse(0x09); //发送左键按下
kk.MyMouse(0);
kk.MyMouse(0x08); //发送左键释放
kk.MyMouse(0);
kk.MyMouse(0);
kk.MyMouse(0);
kk.closewinio();
}
按下btnStart按钮后,发现发送F1键正常的,但是发送左键没有反应。而且发送完发送左键以后会让我的系统再不能输入键盘了(就是打字什么的都不行了,没有反应了。)
我把发送左键代码注销掉,只是发送键盘消息,是正常的,而且发送完以后,我的机器还是可以正常的打字聊天。
PS:我已经把WinIo.dll,WinIo.sys,WINIO.VXD三个文件放我的程序目录下了。
请问为什么不能发鼠标消息,我错在哪里了?谁帮我解决了,我把分都给他。
文章评论(0条评论)
登录后参与讨论