⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winio.pas

📁 WINIO DELPHI模拟鼠标键盘DEMO 带帮助的..winio是没有源码的
💻 PAS
字号:
unit winIO;

interface

uses Windows;

function InitializeWinIo:Boolean;stdcall;
function InstallWinIoDriver(pszWinIoDriverPath:PString;IsDemandLoaded:boolean=false):Boolean;stdcall;
function RemoveWinIoDriver:Boolean;stdcall;
function GetPortVal(PortAddr:Word;PortVal:PDWord;bSize:Byte):Boolean;stdcall;
function SetPortVal(PortAddr:Word;PortVal:DWord;bSize:Byte):Boolean;stdcall;
function GetPhysLong(PhysAddr:PByte;PhysVal:PDWord):Boolean;stdcall;
function SetPhysLong(PhysAddr:PByte;PhysVal:DWord):Boolean;stdcall;
function MapPhysToLin(PhysAddr:PByte;PhysSize:DWord;PhysMemHandle:PHandle):PByte;stdcall;
function UnMapPhysicalMemory(PhysMemHandle:THandle;LinAddr:PByte):Boolean;stdcall;
procedure ShutdownWinIo;stdcall;
procedure MyKeyDown(vKeyCoad:Integer);
procedure MyKeyUp(vKeyCoad:Integer);
procedure MyMouse(vKeyCoad:Integer);
procedure SetKey(SCanCode: byte);
procedure SetMouse(SCanCode: byte);

implementation

function InitializeWinIo:Boolean;stdcall;external 'WinIo.dll' name'InitializeWinIo';
function InstallWinIoDriver(pszWinIoDriverPath:PString;IsDemandLoaded:boolean=false):Boolean;stdcall;external 'WinIo.dll' name 'InstallWinIoDriver';
function RemoveWinIoDriver:Boolean;stdcall;external 'WinIo.dll' name 'RemoveWinIoDriver';
function GetPortVal(PortAddr:Word;PortVal:PDWord;bSize:Byte):Boolean;stdcall;external 'WinIo.dll' name 'GetPortVal';
function SetPortVal(PortAddr:Word;PortVal:DWord;bSize:Byte):Boolean;stdcall;external 'WinIo.dll' name 'SetPortVal';
function GetPhysLong(PhysAddr:PByte;PhysVal:PDWord):Boolean;stdcall;external 'WinIo.dll' name 'GetPhysLong';
function SetPhysLong(PhysAddr:PByte;PhysVal:DWord):Boolean;stdcall;external 'WinIo.dll' name 'SetPhysLong';
function MapPhysToLin(PhysAddr:PByte;PhysSize:DWord;PhysMemHandle:PHandle):PByte;stdcall;external 'WinIo.dll' name 'MapPhysToLin';
function UnMapPhysicalMemory(PhysMemHandle:THandle;LinAddr:PByte):Boolean;stdcall;external 'WinIo.dll' name 'UnmapPhysicalMemory';
procedure ShutdownWinIo;stdcall;external 'WinIo.dll' name'ShutdownWinIo';

procedure KBCWait4IBE; //等待键盘缓冲区为空
var
  dwVal:DWord;
begin
  repeat
    GetPortVal($64,@dwVal,1);
  until (dwVal and $2)=0;
end;

procedure MyKeyDown(vKeyCoad:Integer);
var
  btScancode:DWord;
begin
  btScancode:=MapVirtualKey(vKeyCoad, 0);
  KBCWait4IBE;
  SetPortVal($64, $D2, 1);
  KBCWait4IBE;
  SetPortVal($60, btScancode, 1);
end;

procedure MyKeyUp(vKeyCoad:Integer);
var
  btScancode:DWord;
begin
  btScancode:=MapVirtualKey(vKeyCoad, 0);
  KBCWait4IBE;
  SetPortVal($64, $D2, 1);
  KBCWait4IBE;
  SetPortVal($60, (btScancode or $80), 1);
end;

procedure MyMouse(vKeyCoad:Integer);
begin
  KBCWait4IBE;
  SetPortVal($64, $D3, 1);
  KBCWait4IBE;
  SetPortVal($60, vKeyCoad, 1);
end;

procedure SetKey(SCanCode: byte);
begin
  asm
    //无论向0x60,还是0x64写东西前都要等状态寄存器OBF变0
    @Loop1:
    in al, $64
    and al, 10b
    jnz @Loop1
    //向$64端口写命令
    mov al, $D2//写键盘输出缓存命令
    //mov al, $D3//写鼠标输出缓存命令
    out $64, al

    //无论向0x60,还是0x64写东西前都要等状态寄存器OBF变0
    @Loop2:
    in al, $64
    and al, 10b
    jnz @Loop2
    //向$60端口写参数
    mov al, SCanCode
    out $60, al
  end;
end;

procedure SetMouse(SCanCode: byte);
begin
  asm
    //无论向0x60,还是0x64写东西前都要等状态寄存器OBF变0
    @Loop1:
    in al, $64
    and al, 10b
    jnz @Loop1
    //向$64端口写命令
    //mov al, $D2//写键盘输出缓存命令
    mov al, $D3//写鼠标输出缓存命令
    out $64, al

    //无论向0x60,还是0x64写东西前都要等状态寄存器OBF变0
    @Loop2:
    in al, $64
    and al, 10b
    jnz @Loop2
    //向$60端口写参数
    mov al, SCanCode
    out $60, al
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -