لا يمكن إرسال مفتاح BackSpace باستخدام :: SendInput () إلى تطبيق WordPad

StackOverflow https://stackoverflow.com/questions/2421485

سؤال

لقد استخدمت وظيفة sendInput () ويندوز خطافات لوحة المفاتيح لتطوير لوحة مفاتيح مخصصة للغات الهندية. المشروع في رمز Google هنا: http://code.google.com/p/ekalappai.

يتم وضع وظائف هوك CENYBOAD ووظائف SendInput في Win32 DLL. ويتم استدعاؤهم من exe qt. تطبيقنا يعمل بشكل جيد لمعظم المفاتيح والتطبيقات. أجد المشكلة التالية:

لم أستطع إرسال مفتاح Backspace إلى عدد قليل من التطبيقات مثل الدفتر / OpenOffice / MSOffice. أجد نفس المشكلة مع arrowkeys وحذف المفاتيح.

هنا هو رمزي:

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.

حاولت البحث في جوجل ولكن لم أستطع الرصد على حل حتى الآن. إذا كان أي شخص لديه فكرة عن حل مساعدة الثابتة والمتنقلة. شكرًا.

هل كانت مفيدة؟

المحلول

أنت تخليط المفتاح الظاهري ورمز المسح. عضو WVK هو المهمة، لن يتم استخدام رمز المسح فقط هو المفتاح الظاهري غير غامض. يصلح:

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

نصائح أخرى

الوثائق تقول:

إذا تم تحديد keyeventf_unicode، يرسل SendInPut إرسال رسالة WM_KEYDown أو WM_KEYUP إلى قائمة انتظار رسائل الخيط الأمامي مع WPARAM تساوي VK_PACKET. بمجرد أن تحصل GetMessage أو Peekmessage على هذه الرسالة، تمرير الرسالة إلى TranslatAtemessage المشاركات رسالة WM_CHAR مع حرف Unicode المحدد أصلا بواسطة WSCAN.

مجرد تخمين، ولكن قد تؤدي برامج معالجة النصوص إلى تشغيل سلوك الفناء الخلفي من رسائل WM_KEYDOWDO / WM_KEYUP وليس WM_CHAR. وبالتالي قد يتوقعون vk_backspace (وليس vk_packet) مثل wparam من تلك الرسائل. قد يتم ذلك مع المسرعات المستندة إلى فخرية وليس أحرف ... هيك، أنت على ويندوز، إلى حد كبير شيء ممكن. :)

هل حاولت عدم استخدام keyeventf_unicode، والقيام به kb.wVk = VK_BACKSPACE ?

(أيضا، قد تستخدم التجسس ++ للحصول على فكرة أفضل من الرسائل الرئيسية التي يتم بها إرسال الرسائل الرئيسية إلى التطبيق الهدف وكيف يختلف عنها عندما تضغط على مسافة معينة حرفية.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top