首頁 >後端開發 >C++ >如何使用 SendInput 發送多個字元並管理 Unicode 注意事項?

如何使用 SendInput 發送多個字元並管理 Unicode 注意事項?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-25 04:15:29673瀏覽

How to send multiple characters using SendInput and manage Unicode considerations?

使用 SendInput 發送多個字元

使用 SendInput 發送字元時,了解如何處理多個字元非常重要。

錯誤案例:參數不正確

您提供的代碼嘗試發送兩個字符,但由於參數不正確而失敗。 SendInput 的第一個參數指定 INPUT 結構的數量,但您在嘗試傳送 2 時傳入了 1。

正確方法:多個 INPUT 結構

要傳送多個字符,您需要一個陣列多個 INPUT 結構。每個結構代表一個按鍵事件,對於每個字符,您需要兩個事件:

  • Keydown 事件
  • Keyup 事件

因此,要發送2字符,您需要4 個INPUT 結構。

Unicode 注意事項

使用 KEYEVENTF_UNICODE 標誌時,您需要指定實際的 Unicode 代碼點而不是虛擬鍵。此外,UTF-16 代理程式對需要兩組向下/向上 INPUT。

範例程式碼

以下是使用 SendInput 傳送 Unicode 字串的範例函數:

<code class="c++">#include <vector>
#include <string>

void SendInputString(const std::wstring &str) {
    int len = str.length();
    if (len == 0) return;

    std::vector<INPUT> in(len * 2);
    ZeroMemory(&in[0], in.size() * sizeof(INPUT));

    int i = 0, idx = 0;
    while (i < len) {
        WORD ch = (WORD)str[i++];

        if ((ch < 0xD800) || (ch > 0xDFFF)) {
            in[idx].type = INPUT_KEYBOARD;
            in[idx].ki.wScan = ch;
            in[idx].ki.dwFlags = KEYEVENTF_UNICODE;
            ++idx;

            in[idx] = in[idx - 1];
            in[idx].ki.dwFlags |= KEYEVENTF_KEYUP;
            ++idx;
        } else {
            in[idx].type = INPUT_KEYBOARD;
            in[idx].ki.wScan = ch;
            in[idx].ki.dwFlags = KEYEVENTF_UNICODE;
            ++idx;

            in[idx].type = INPUT_KEYBOARD;
            in[idx].ki.wScan = (WORD)str[i++];
            in[idx].ki.dwFlags = KEYEVENTF_UNICODE;
            ++idx;

            in[idx] = in[idx - 2];
            in[idx].ki.dwFlags |= KEYEVENTF_KEYUP;
            ++idx;

            in[idx] = in[idx - 2];
            in[idx].ki.dwFlags |= KEYEVENTF_KEYUP;
            ++idx;
        }
    }

    SendInput(in.size(), &in[0], sizeof(INPUT));
}</code>

以上是如何使用 SendInput 發送多個字元並管理 Unicode 注意事項?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn