簡體   English   中英

無法使用:: SendInput()將退格鍵發送到寫字板應用程序

[英]Could not send backspace key using ::SendInput() to wordpad application

我已經使用sendinput()函數和Windows鍵盤掛鈎為印度語言開發了自定義鍵盤。 專案位於Google程式碼中: http//code.google.com/p/ekalappai

鍵盤掛鈎和sendinput函數放置在win32 dll中。 然后從Qt exe調用它們。 我們的應用程序適用於大多數鍵和應用程序。 我發現以下問題:

我無法將Backspace密鑰發送到幾個應用程序,例如Wordpad / Openoffice / MsOffice。 我發現箭頭鍵和刪除鍵存在相同的問題。

這是我的代碼:

extern "C" __declspec(dllexport) void GenerateKey(int vk , bool bExtended)
{
    //update previous characters
    previous_2_character = previous_1_character;
    previous_1_character = vk;

    KEYBDINPUT kb={0};
    INPUT Input={0};

    //keydown
    kb.wVk    =  0;
    kb.wScan = vk;/*enter unicode here*/;
    kb.dwFlags = KEYEVENTF_UNICODE; // KEYEVENTF_UNICODE=4
    Input.type = INPUT_KEYBOARD;
    Input.ki = kb;

    ::SendInput(1,&Input,sizeof(Input));

    //keyup
    kb.wVk    =  0;
    kb.wScan = vk;/*enter unicode here*/;
    kb.dwFlags = KEYEVENTF_UNICODE|KEYEVENTF_KEYUP; //KEYEVENTF_UNICODE=4
    Input.type = INPUT_KEYBOARD;
    Input.ki = kb;

    ::SendInput(1,&Input,sizeof(Input));
}

完整的dll代碼在這里: http : //code.google.com/p/ekalappai/source/browse/trunk/ekhook/ekhook/dllmain.cpp

調用代碼:

generatekey = (GenerateKey) myLib->resolve( "GenerateKey" );

generatekey(44,FALSE); //comma - THis works in wordpad/MsOffice/Openoffice
generatekey(2949,FALSE); //tamil character "a" works in Wordpad/Msoffice/Openoffice

generatekey(8,FALSE); //backspace - This is NOT working in Wordpad/Msoffice/Openoffice

來自Qt Exe的完整調用代碼位於: http : //code.google.com/p/ekalappai/source/browse/trunk/ekalappai/window.cpp

我嘗試在Google中搜索,但無法解決問題。 如果有人對解決這個問題有幫助,請幫助。 謝謝。

您正在混合虛擬密鑰和掃描代碼。 wVk成員是重要的成員,只有虛擬密鑰不明確時才使用掃描代碼。 固定:

kb.wVk   = vk;
kb.wScan = 0;   // TODO: look at VkKeyScanEx()

該文件說:

如果指定了KEYEVENTF_UNICODE,則SendInput將WParam等於VK_PACKET的WM_KEYDOWN或WM_KEYUP消息發送到前台線程的消息隊列。 一旦GetMessage或PeekMessage獲得此消息,將消息傳遞給TranslateMessage就會發布WM_CHAR消息,該消息帶有wScan最初指定的Unicode字符。

只是一個猜測,但是文字處理程序可能會觸發WM_KEYDOWN / WM_KEYUP消息而不是WM_CHAR消息的退格行為。 因此,他們可能期望VK_BACKSPACE(而不是VK_PACKET)作為那些消息的wParam。 甚至可以使用基於VKEY而不是字符的加速器來完成...哎呀,您在Windows上,所以幾乎所有可能。 :)

您是否嘗試過不使用KEYEVENTF_UNICODE並執行kb.wVk = VK_BACKSPACE

(此外,您可以使用Spy ++更好地了解將哪些關鍵消息發送到目標應用程序,以及與擊中文字退格鍵時的區別。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM