تخطيط تغيير لوحة المفاتيح لعملية أخرى
-
06-07-2019 - |
سؤال
وأنا أكتب برنامج في C # التي تعمل في الخلفية ويتيح للمستخدمين استخدام هوتكي للتبديل تخطيطات لوحة المفاتيح في الإطار النشط. (ويندوز يدعم فقط CTRL + SHIFT و ALT + SHIFT )
وأنا باستخدام RegisterHotKey للقبض على هوتكي، وانها تعمل بشكل جيد.
والمشكلة هي أنني لا يمكن العثور على أي API لتغيير تخطيط لوحة المفاتيح لنافذة تركيزا.
وActivateKeyboardLayout وLoadKeyboardLayout يمكن فقط تغيير تخطيط لوحة المفاتيح لموضوع الاستدعاء.
لا أحد يعرف كيفية تغيير تخطيط لوحة المفاتيح لموضوع مختلف (على طريقة شريط اللغة لا)؟
المحلول
وهناك طريقة أخرى التي قد تكون مقبولة إذا كنت تكتب شيئا لنفسك فقط: تحديد تركيبة مفاتيح منفصلة لكل تخطيط (مثل Alt + العالي + 1، الخ)، واستخدام <لأ href = "HTTP: // MSDN .microsoft.com / EN-US / مكتبة / ms646310.aspx "يختلط =" نوفولو noreferrer "عنوان =" SendInput "> SendInput لالتبديل بينهما.
والظروف التي هذا هو صالحة للاستعمال تقتصر بطبيعة الحال.
نصائح أخرى
PostMessage(handle,
WM_INPUTLANGCHANGEREQUEST,
0,
LoadKeyboardLayout( StrCopy(Layout,'00000419'), KLF_ACTIVATE)
);
وأعتقد أن الحيلة هي للحصول على التعليمات البرمجية لتنفيذ في سياق موضوع الذي ترغب في تغيير تخطيط لوحة المفاتيح. سوف تحتاج إلى القيام ببعض إمكانية التشغيل المتداخل Win32 وهنا والتعرف على حقن DLL للحصول على التعليمات البرمجية لتنفيذ في موضوع بعيد.
لوحة المفاتيح هوك معالج يبدو خيار جيد بالنسبة لك هنا.
ونلقي نظرة على http://www.codeproject.com/KB/threads/winspy.aspx
function ChangeRemoteWndKeyboardLayoutToRussian(
const RemoteHandle: THandle): Boolean;
var
Dumme: DWORD;
Layout: HKL;
begin
Layout := LoadKeyboardLayout('00000419', KLF_ACTIVATE);
Result := SendMessageTimeOut(RemoteHandle, WM_INPUTLANGCHANGEREQUEST,
0, Layout, SMTO_ABORTIFHUNG, 200, Dumme) <> 0;
if Result then
Result := SendMessageTimeOut(RemoteHandle, WM_INPUTLANGCHANGEREQUEST,
RUSSIAN_CHARSET, Layout, SMTO_ABORTIFHUNG, 200, Dumme) <> 0;
end;