2008-11-04 16 views
13

के लिए कीबोर्ड लेआउट बदलें मैं सी # में एक प्रोग्राम लिख रहा हूं जो पृष्ठभूमि में चलता है और सक्रिय विंडो में कीबोर्ड लेआउट स्विच करने के लिए उपयोगकर्ताओं को हॉटकी का उपयोग करने की अनुमति देता है।अन्य प्रक्रिया

मैं RegisterHotKey उपयोग कर रहा हूँ हॉटकी को पकड़ने के लिए (केवल Windows CTRL + शिफ्ट और एएलटी + शिफ्ट का समर्थन करता है), और यह ठीक काम कर रहा है।

समस्या यह है कि मुझे केंद्रित विंडो के लिए कीबोर्ड लेआउट बदलने के लिए कोई एपीआई नहीं मिल रहा है।

सक्रियेटबोर्डबोर्ड और लोडकीबोर्डआउटआउट केवल कॉलिंग थ्रेड के लिए कीबोर्ड लेआउट बदल सकता है।

क्या कोई जानता है कि एक अलग थ्रेड के लिए कीबोर्ड लेआउट कैसे बदलें (जिस तरह भाषा बार करता है)?

+0

जब आप एक windows-निर्मित हॉटकी का उपयोग कर भाषाओं स्विच, यह अलग धागे को प्रभावित नहीं करता है, यह करता है? – JXG

+0

प्रति थ्रेड कीबोर्ड लेआउट स्विचिंग? सिस्टम-व्यापी लेआउट स्विचिंग के विरोध में? रिकॉर्डिंग के साथ कुछ कर रहे हो? – jcolebrand

+0

@drachenstern: सिस्टम-व्यापी कीबोर्ड लेआउट स्विचिंग जैसी कोई चीज़ नहीं है; सक्रिय कीबोर्ड लेआउट एक प्रति-यूआई-थ्रेड स्थिति है। मैं Alt + Shift को प्रतिस्थापित करने की कोशिश कर रहा हूं ताकि मैं इसे दुर्घटना से दबा न सकूं, इसलिए रिकॉर्डिंग एक विकल्प नहीं है (यदि मैं समझता हूं कि आपका क्या मतलब है)। – SLaks

उत्तर

1

एक और तरीका है पर एक नज़र कि स्वीकार्य अगर आप सिर्फ अपने लिए कुछ लिख रहे हैं हो सकता है ले लो: (आदि Alt + Shift जैसे +1,) हर लेआउट के लिए एक अलग कुंजी संयोजन को परिभाषित है, और उनके बीच स्विच करने के लिए SendInput का उपयोग करें।

परिस्थितियों में यह उपयोग करने योग्य परिस्थितियों तक सीमित हैं।

2

मुझे लगता है कि यह चाल थ्रेड के संदर्भ में निष्पादित करने के लिए आपका कोड प्राप्त करना है जिसका कीबोर्ड लेआउट आप बदलना चाहते हैं। आपको यहां कुछ Win32 इंटरऑप करने की आवश्यकता होगी और रिमोट थ्रेड में अपना कोड निष्पादित करने के लिए DLL इंजेक्शन के बारे में जानें।

keyboard hook handler आपके लिए यहां एक अच्छा विकल्प दिखता है।

http://www.codeproject.com/KB/threads/winspy.aspx

8
PostMessage(handle, 
    WM_INPUTLANGCHANGEREQUEST, 
    0, 
    LoadKeyboardLayout(StrCopy(Layout,'00000419'), KLF_ACTIVATE) 
); 
+0

यह 'हैंडल' के लिए 'GetForegroundWindow' का उपयोग करके पूरी तरह से काम करता है। एक अपवाद डब्ल्यूपीएफ प्रोग्राम है, जो इस संदेश के जवाब में लॉक लग रहा है। –

0
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; 
+0

यदि मैं सही ढंग से याद करता हूं, तो यह प्रक्रियाओं में काम नहीं करता है। – SLaks

संबंधित मुद्दे