[转载]C# 封装winio.dll 驱动级按键鼠标操作模拟

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

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

}
///Wait for Buffer gets empty
private void KBCWait4IBE()
{
int dwVal = 0;
do
{
bool flag = GetPortVal((IntPtr)0x64, out dwVal, 1);
}
while ((dwVal & 0x2) > 0);
}
/// key down
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);
}
/// Key up
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);
}
/// Simulate mouse down
public void MyMouseDown(int vKeyCoad)
{
int btScancode = 0;
btScancode
= MapVirtualKey((byte)vKeyCoad, 0);
KBCWait4IBE();
// 'wait for buffer gets empty
SetPortVal(KBC_KEY_CMD, (IntPtr)0xD3, 1);// 'send write command
KBCWait4IBE();
SetPortVal(KBC_KEY_DATA, (IntPtr)(btScancode
| 0x80), 1);// 'write in io
}
/// Simulate mouse up
public void MyMouseUp(int vKeyCoad)
{
int btScancode = 0;
btScancode
= MapVirtualKey((byte)vKeyCoad, 0);
KBCWait4IBE();
// 'wait for buffer gets empty
SetPortVal(KBC_KEY_CMD, (IntPtr)0xD3, 1); //'send write command
KBCWait4IBE();
SetPortVal(KBC_KEY_DATA, (IntPtr)(btScancode
| 0x80), 1);// 'write in io
}


//----------------------------------------------------------------------------------
//VK codes
//----------------------------------------------------------------------------------
public enum Key
{
// mouse movements
move = 0x0001,
leftdown
= 0x0002,
leftup
= 0x0004,
rightdown
= 0x0008,
rightup
= 0x0010,
middledown
= 0x0020,
//keyboard stuff
VK_LBUTTON = 1,
VK_RBUTTON
= 2,
VK_CANCEL
= 3,
VK_MBUTTON
= 4,
VK_BACK
= 8,
VK_TAB
= 9,
VK_CLEAR
= 12,
VK_RETURN
= 13,
VK_SHIFT
= 16,
VK_CONTROL
= 17,
VK_MENU
= 18,
VK_PAUSE
= 19,
VK_CAPITAL
= 20,
VK_ESCAPE
= 27,
VK_SPACE
= 32,
VK_PRIOR
= 33,
VK_NEXT
= 34,
VK_END
= 35,
VK_HOME
= 36,
VK_LEFT
= 37,
VK_UP
= 38,
VK_RIGHT
= 39,
VK_DOWN
= 40,
VK_SELECT
= 41,
VK_PRINT
= 42,
VK_EXECUTE
= 43,
VK_SNAPSHOT
= 44,
VK_INSERT
= 45,
VK_DELETE
= 46,
VK_HELP
= 47,
VK_NUM0
= 48, //0
VK_NUM1 = 49, //1
VK_NUM2 = 50, //2
VK_NUM3 = 51, //3
VK_NUM4 = 52, //4
VK_NUM5 = 53, //5
VK_NUM6 = 54, //6
VK_NUM7 = 55, //7
VK_NUM8 = 56, //8
VK_NUM9 = 57, //9
VK_A = 65, //A
VK_B = 66, //B
VK_C = 67, //C
VK_D = 68, //D
VK_E = 69, //E
VK_F = 70, //F
VK_G = 71, //G
VK_H = 72, //H
VK_I = 73, //I
VK_J = 74, //J
VK_K = 75, //K
VK_L = 76, //L
VK_M = 77, //M
VK_N = 78, //N
VK_O = 79, //O
VK_P = 80, //P
VK_Q = 81, //Q
VK_R = 82, //R
VK_S = 83, //S
VK_T = 84, //T
VK_U = 85, //U
VK_V = 86, //V
VK_W = 87, //W
VK_X = 88, //X
VK_Y = 89, //Y
VK_Z = 90, //Z
VK_NUMPAD0 = 96, //0
VK_NUMPAD1 = 97, //1
VK_NUMPAD2 = 98, //2
VK_NUMPAD3 = 99, //3
VK_NUMPAD4 = 100, //4
VK_NUMPAD5 = 101, //5
VK_NUMPAD6 = 102, //6
VK_NUMPAD7 = 103, //7
VK_NUMPAD8 = 104, //8
VK_NUMPAD9 = 105, //9
VK_NULTIPLY = 106,
VK_ADD
= 107,
VK_SEPARATOR
= 108,
VK_SUBTRACT
= 109,
VK_DECIMAL
= 110,
VK_DIVIDE
= 111,
VK_F1
= 112,
VK_F2
= 113,
VK_F3
= 114,
VK_F4
= 115,
VK_F5
= 116,
VK_F6
= 117,
VK_F7
= 118,
VK_F8
= 119,
VK_F9
= 120,
VK_F10
= 121,
VK_F11
= 122,
VK_F12
= 123,
VK_NUMLOCK
= 144,
VK_SCROLL
= 145,
middleup
= 0x0040,
xdown
= 0x0080,
xup
= 0x0100,
wheel
= 0x0800,
virtualdesk
= 0x4000,
absolute
= 0x8000
}
}
}
转载,原文http://hi.baidu.com/jonesvale/blog/item/c3aedc014817591a738b6551.html
posted @ 2011-06-17 09:59  麦田里的守望者  阅读(2242)  评论(0编辑  收藏  举报