首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C# 全局鍵盤鼠標模擬:user32.dll SendInput 實現組合鍵

     編輯:程式設計疑難解答

核心 API

[DllImport("user32.dll", SetLastError = true)]
static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);

// 定義 INPUT 結構體 (鍵盤/鼠標/硬件)
struct INPUT { public uint type; public InputUnion u; }
[StructLayout(LayoutKind.Explicit)]
struct InputUnion {
    [FieldOffset(0)] public MOUSEINPUT mi;
    [FieldOffset(0)] public KEYBDINPUT ki;
    [FieldOffset(0)] public HARDWAREINPUT hi;
}
struct KEYBDINPUT {
    public ushort wVk; public ushort wScan;
    public uint dwFlags; public uint time; public IntPtr dwExtraInfo;
}

發送組合鍵示例 (Win+R)

const uint KEYEVENTF_KEYDOWN = 0x0000;
const uint KEYEVENTF_KEYUP = 0x0002;
const int VK_LWIN = 0x5B; const int VK_R = 0x52;

INPUT[] inputs = new INPUT[4];
// Win Down
inputs[0] = new INPUT { type=1, u=new InputUnion{ki=new KEYBDINPUT{wVk=VK_LWIN, dwFlags=KEYEVENTF_KEYDOWN}}};
// R Down
inputs[1] = new INPUT { type=1, u=new InputUnion{ki=new KEYBDINPUT{wVk=VK_R, dwFlags=KEYEVENTF_KEYDOWN}}};
// R Up
inputs[2] = new INPUT { type=1, u=new InputUnion{ki=new KEYBDINPUT{wVk=VK_R, dwFlags=KEYEVENTF_KEYUP}}};
// Win Up
inputs[3] = new INPUT { type=1, u=new InputUnion{ki=new KEYBDINPUT{wVk=VK_LWIN, dwFlags=KEYEVENTF_KEYUP}}};
SendInput(4, inputs, Marshal.SizeOf(typeof(INPUT)));

注意

  • 需引用 System.Runtime.InteropServices
  • 管理員權限程序可注入非管理員窗口,反之不行
  • 推薦封裝為 KeyboardSimulator 類,提供 PressKeyCombination(params Keys[])
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved