首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 實現螢幕鍵盤 ScreenKeyboard(四)——SendInput 模擬鍵盤輸入與按鈕點擊處理

     編輯:關於C語言

鉤子 DLL 編譯與使用

將鉤子類別編譯為 DLL,應用程式引用並透過事件監聽所有鍵盤/滑鼠事件。

SendInput 模擬按鍵核心代碼


private void SendKeyDown(short key)
{
    Input[] input = new Input[1];
    input[0].type = INPUT.KEYBOARD;
    input[0].ki.wVk = key;
    input[0].ki.time = NativeMethods.GetTickCount();

    if (NativeMethods.SendInput((uint)input.Length, input, Marshal.SizeOf(input[0])) < input.Length)
        throw new Win32Exception(Marshal.GetLastWin32Error());
}

private void SendKeyUp(short key)
{
    Input[] input = new Input[1];
    input[0].type = INPUT.KEYBOARD;
    input[0].ki.wVk = key;
    input[0].ki.dwFlags = KeyboardConstaint.KEYEVENTF_KEYUP;
    input[0].ki.time = NativeMethods.GetTickCount();

    if (NativeMethods.SendInput((uint)input.Length, input, Marshal.SizeOf(input[0])) < input.Length)
        throw new Win32Exception(Marshal.GetLastWin32Error());
}

自訂 KeyboardButton 控制項點擊處理


private void ButtonOnClick(object sender, EventArgs e)
{
    KeyboardButton btnKey = sender as KeyboardButton;
    if (btnKey == null) return;
    SendKeyCommand(btnKey);
}

private void SendKeyCommand(KeyboardButton keyButton)
{
    short key = keyButton.VKCode;
    
    if (combinationVKButtonsMap.ContainsKey(key))
    {
        // 組合鍵 (Shift/Ctrl/Alt/Win):按下/釋放切換狀態
        if (keyButton.Checked)
            SendKeyUp(key);
        else
            SendKeyDown(key);
    }
    else
    {
        // 一般鍵:完整 Down + Up 序列
        SendKeyDown(key);
        SendKeyUp(key);
    }
}

關鍵設計點

  • INPUT 結構:LayoutKind.Explicit 同一記憶體區塊切換鍵盤/滑鼠/硬體輸入
  • KEYEVENTF_KEYUP:標記釋放事件,配合 Down 形成完整點擊
  • GetTickCount:提供時間戳,系統用於輸入排序
  • 組合鍵狀態保持:Checked 屬性追蹤按下/釋放狀態
  • 錯誤處理:SendInput 回傳值檢查,失敗拋出 Win32Exception
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved