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

本文介绍了一个使用C#实现的WinIo类库,该库能够模拟键盘输入,包括按键按下、抬起及鼠标操作等功能。通过调用Windows API函数,实现对键盘扫描码的直接写入,从而模拟真实的键盘事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


  
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

转载于:https://www.cnblogs.com/x2048/archive/2011/06/17/winiocsharp.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值