PDA

View Full Version : سوال: یافتن کارکتر هر کلید در صفحه کلید بدون استفاده از رخداد ها



m.h.movahedi
سه شنبه 19 خرداد 1394, 14:17 عصر
سلام
می دونیم که صفحه کلیدها تا حدودی با هم تفاوت دارند به عنوان مثال برای نوشتن حرف "پ" در صفحه کلیدهای متفاوت ممکنه لازم باشه کلیدهای متفاوتی فشرده بشه. آیا راهی هست که بدون اینکه لازم باشه کاربر تمام کلیدهای صفحه کلید رو فشار بده جای اونها رو تشخیص داد؟ یا ممکنه با دستورات برنامه نویسی و بدون دخالت کاربر نقشه کلیدها رو بدست آورد؟

Javad_raouf
سه شنبه 19 خرداد 1394, 16:44 عصر
سلام
[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Unicode)]
static extern short VkKeyScanEx(char ch, IntPtr dwhkl);
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern bool UnloadKeyboardLayout(IntPtr hkl);
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern IntPtr LoadKeyboardLayout(string pwszKLID, uint Flags);
public class KeyboardPointer : IDisposable
{
private readonly IntPtr pointer;



public KeyboardPointer(int klid)
{
pointer = LoadKeyboardLayout(klid.ToString("X8"), 1);
}
public KeyboardPointer(System.Globalization.CultureInfo culture)
: this(culture.KeyboardLayoutId) { }
public KeyboardPointer(string LanguageTowChar)
: this(GetCultureInfo("fa").KeyboardLayoutId) { }
public KeyboardPointer()
: this(GetCultureInfoPersian().KeyboardLayoutId) { }
public void Dispose()
{
UnloadKeyboardLayout(pointer);
GC.SuppressFinalize(this);
}
~KeyboardPointer()
{
UnloadKeyboardLayout(pointer);
}
public static System.Globalization.CultureInfo GetCultureInfoPersian() { return GetCultureInfo("fa"); }
public static System.Globalization.CultureInfo GetCultureInfo(string TwoChar)
{
for (int i = 0; i < InputLanguage.InstalledInputLanguages.Count; i++)
{
string strTwo = InputLanguage.InstalledInputLanguages[i].Culture.TwoLetterISOLanguageName;
if (strTwo.ToLower() == TwoChar.ToLower())
return InputLanguage.InstalledInputLanguages[i].Culture;
}
return System.Globalization.CultureInfo.CurrentCulture;
}
public static string KeyToString(Keys key)
{
StringBuilder desc = new StringBuilder();
if ((key & Keys.Shift) != Keys.None)
desc.Append("Shift: ");
if ((key & Keys.Control) != Keys.None)
desc.Append("Control: ");
if ((key & Keys.Alt) != Keys.None)
desc.Append("Alt: ");
return desc.Append(key & Keys.KeyCode).ToString();
}


public Keys GetKey(char Character)
{
short keyNumber = VkKeyScanEx(Character, pointer);
if (keyNumber == -1)
return System.Windows.Forms.Keys.None;
return (System.Windows.Forms.Keys)(((keyNumber & 0xFF00) << 8) | (keyNumber & 0xFF));
}
public string GetKeyString(char Character)
{
return KeyToString(GetKey(Character));
}
}
KeyboardPointer kp = new KeyboardPointer("fa");
این کد رو هر جا خواستی کپی کن
بعد با استفاده از خروجی این متد می تونی بفهمی مثلا حرف "پ" با کدوم دکمه کیبورد تایپ میشه:
kp.GetKeyString('پ');
لازم به ذکره که فقط حروف فارسی رو جواب میده که شما نیاز داری
حتما هم باید کیبورد فارسی نصب باشه

m.h.movahedi
چهارشنبه 20 خرداد 1394, 08:38 صبح
سلام و تشکر فراوان
آیا راهی هست که به نوعی کلید رو( مثلاً از طریق یه شماره) داد و کارکتر رو گرفت یا اینکه با فشردن شیفت و کلید چه کارکتری نمایش داده می شه.
به خاطر اینکه شیفت و برخی کلید ها ایجاد حرکت می کنند نه حرف الفبا مثلاً shift+S روی کیبرد من " ُ" رو نتیجه میده.

Javad_raouf
چهارشنبه 20 خرداد 1394, 08:46 صبح
من بلد نیستم
ولی از همین طریق که عرض کردم وقتی همه کاراکتر ها رو بررسی کنید حتی کاراکتر هایی مثل
" ُ" بازم به جواب می رسید. چه سر به کلاه چه کلاه به سر

m.h.movahedi
چهارشنبه 03 تیر 1394, 08:46 صبح
سلام
استفاده از این کد باعث میشه که زبان سیستم به زبان پیش فرض تغییر پیدا کنه و دیگه هم قابل تغییر نباشه و انتخاب زبان موجود در taskbar هم مخفی بشه. اگر سیستم ریست بشه همه چیز عادی میشه ولی این مشکل بزرگی در برنامه است. آیا راهی برای جلوگیری یا رفع این مشکل هست؟