Microsoft Keyboard Layout Creator प्रणाली कीबोर्ड लोड और उन्हें .klc files के रूप में निर्यात कर सकते हैं। चूंकि यह .NET में लिखा गया है, यह देखने के लिए कि आप इसे कैसे करते हैं, Reflector का उपयोग कर सकते हैं और इसे चलाने के लिए प्रतिबिंब का उपयोग कर सकते हैं। नीचे दिए गए C# कोड का उपयोग करके बनाया गया zip file of .klc files for the 187 keyboards in Windows 8 है। ध्यान दें कि मैं मूल रूप से Windows XP के लिए यह लिखा था, और अब विंडोज 8 और ऑन-स्क्रीन कीबोर्ड के साथ, यह वास्तव में धीमी है और टास्कबार दुर्घटना लगता है:/हालांकि, यह काम :)
using System;
using System.Collections;
using System.IO;
using System.Reflection;
class KeyboardExtractor {
static Object InvokeNonPublicStaticMethod(Type t, String name,
Object[] args)
{
return t.GetMethod(name, BindingFlags.Static | BindingFlags.NonPublic)
.Invoke(null, args);
}
static void InvokeNonPublicInstanceMethod(Object o, String name,
Object[] args)
{
o.GetType().GetMethod(name, BindingFlags.Instance |
BindingFlags.NonPublic) .Invoke(o, args);
}
static Object GetNonPublicProperty(Object o, String propertyName) {
return o.GetType().GetField(propertyName,
BindingFlags.Instance | BindingFlags.NonPublic)
.GetValue(o);
}
static void SetNonPublicField(Object o, String propertyName, Object v) {
o.GetType().GetField(propertyName,
BindingFlags.Instance | BindingFlags.NonPublic)
.SetValue(o, v);
}
[STAThread] public static void Main() {
System.Console.WriteLine("Keyboard Extractor...");
KeyboardExtractor ke = new KeyboardExtractor();
ke.extractAll();
System.Console.WriteLine("Done.");
}
Assembly msklcAssembly;
Type utilitiesType;
Type keyboardType;
String baseDirectory;
public KeyboardExtractor() {
msklcAssembly = Assembly.LoadFile("C:\\Program Files\\Microsoft Keyboard Layout Creator 1.4\\MSKLC.exe");
utilitiesType = msklcAssembly.GetType("Microsoft.Globalization.Tools.KeyboardLayoutCreator.Utilities");
keyboardType = msklcAssembly.GetType("Microsoft.Globalization.Tools.KeyboardLayoutCreator.Keyboard");
baseDirectory = Directory.GetCurrentDirectory();
}
public void extractAll() {
DateTime startTime = DateTime.UtcNow;
SortedList keyboards = (SortedList)InvokeNonPublicStaticMethod(
utilitiesType, "KeyboardsOnMachine", new Object[] {false});
DateTime loopStartTime = DateTime.UtcNow;
int i = 0;
foreach (DictionaryEntry e in keyboards) {
i += 1;
Object k = e.Value;
String name = (String)GetNonPublicProperty(k, "m_stLayoutName");
String layoutHexString = ((UInt32)GetNonPublicProperty(k, "m_hkl"))
.ToString("X");
TimeSpan elapsed = DateTime.UtcNow - loopStartTime;
Double ticksRemaining = ((Double)elapsed.Ticks * keyboards.Count)
/i - elapsed.Ticks;
TimeSpan remaining = new TimeSpan((Int64)ticksRemaining);
String msgTimeRemaining = "";
if (i > 1) {
// Trim milliseconds
remaining = new TimeSpan(remaining.Hours, remaining.Minutes,
remaining.Seconds);
msgTimeRemaining = String.Format(", about {0} remaining",
remaining);
}
System.Console.WriteLine(
"Saving {0} {1}, keyboard {2} of {3}{4}",
layoutHexString, name, i, keyboards.Count,
msgTimeRemaining);
SaveKeyboard(name, layoutHexString);
}
System.Console.WriteLine("{0} elapsed", DateTime.UtcNow - startTime);
}
private void SaveKeyboard(String name, String layoutHexString) {
Object k = keyboardType.GetConstructors(
BindingFlags.Instance | BindingFlags.NonPublic)[0]
.Invoke(new Object[] {
new String[] {"", layoutHexString},
false});
SetNonPublicField(k, "m_fSeenOrHeardAboutPropertiesDialog", true);
SetNonPublicField(k, "m_stKeyboardTextFileName",
String.Format("{0}\\{1} {2}.klc",
baseDirectory, layoutHexString, name));
InvokeNonPublicInstanceMethod(k, "mnuFileSave_Click",
new Object[] {new Object(), new EventArgs()});
((IDisposable)k).Dispose();
}
}
करता है मूल रूप से, यह सिस्टम पर सभी कीबोर्ड की एक सूची प्राप्त करता है, फिर प्रत्येक के लिए, इसे एमएसकेएलसी में लोड करता है, "इस रूप में सहेजें" फ़ाइल नाम सेट करता है, यह इस बारे में है कि यह पहले से ही कस्टम कीबोर्ड गुणों को कॉन्फ़िगर कर चुका है या फिर फ़ाइल पर एक क्लिक अनुकरण करता है - > मेनू आइटम सहेजें।
यह वास्तव में एक अच्छा सवाल है ... अन्य वातावरण (लिनक्स) को लेआउट पोर्ट करना संभव भी हो सकता है, लेकिन शायद यह पाठ्यक्रम के कॉपीराइट का उल्लंघन हो सकता है। – unwind
बिल्ट-इन विंडोज टैबलेट कीबोर्ड का उपयोग करना आसान नहीं होगा? (जाहिर है कि ओएस में स्थापित सही एक्सटेंशन की आवश्यकता है, लेकिन ऐसा लगता है कि इन दिनों इसमें केवल एक वाकम प्लगिंग करना पर्याप्त है, तो शायद और तरीके हो सकते हैं?)। –