سؤال

وأنا أكتب برنامج في 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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top