PDA

View Full Version : حرفه ای: مشکل ثبت دکمه با user32.dll



v30sharp
شنبه 31 خرداد 1393, 10:53 صبح
سلام
مسئله : می خوام با استفاده از user32.dll دکمه های که ماربر وارد مینه رو در تکست بتکس نشون بدم ! حروف بزرک کوچیک و با شیفت
مشکل :
موقع ثبت دکمه ها فشار داده شده بین حروف بزرگ و کوچیک فرق نمیزاره و همش رو بزرگ ثبت میکنه و موقع فشار دادن شیفت یک کاراکتر عجیب میندازه و بازم اون دمه همرا شیفت زده شده را مثال : shift+aاون حرف a رو با Aبزرگ نشون میده نه کوچیک..

[DllImport("user32.dll")]
public static extern int GetAsyncKeyState(Int32 i);

---------------

for (Int32 i = 0; i < 255; i++)
{
int keyState = GetAsyncKeyState(i);
if (keyState == 1 || keyState == -32767)
{
richTextBox1.Text += Convert.ToChar(i).ToString();
break;
}

plus
شنبه 31 خرداد 1393, 11:47 صبح
این تابع با Virtual Key ها کار میکنه و کد Virtual Key لزوما برابر با کد ASCII نیست.در Virtual Key ها، حروف بزرگ و کوچیک فرق ندارن همونطور که روی Keyboard شما فقط یدونه A هست...
این تابع فقط وضعیت کلید ها رو به شما میده و نه کد اسکی "کاراکتر" رو .برای مثال به شما میگه کلید shift و کلید A فشار داده شده ان اما نمیاد Shift رو روی A اعمال کنه و کاراکتر حاصل رو برگردونه.

http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
http://stackoverflow.com/questions/6929275/how-to-convert-a-virtual-key-code-to-a-character-according-to-the-current-keyboa

v30sharp
شنبه 31 خرداد 1393, 15:30 عصر
خوب حلا من برای رسیدن به هدفم باید چکار کنم ؟ چه کدی رو باید استفاده کنم فکر کنم این باشه :
[DllImport("user32.dll")]
public static extern int ToUnicode(uint virtualKeyCode, uint scanCode,
byte[] keyboardState,
[Out, MarshalAs(UnmanagedType.LPWStr, SizeConst = 64)]
StringBuilder receivingBuffer,
int bufferSize, uint flags);
static string GetCharsFromKeys(Keys keys, bool shift, bool altGr)
{
var buf = new StringBuilder(256);
var keyboardState = new byte[256];
if (shift)
keyboardState[(int) Keys.ShiftKey] = 0xff;
if (altGr)
{
keyboardState[(int) Keys.ControlKey] = 0xff;
keyboardState[(int) Keys.Menu] = 0xff;
}
WinAPI.ToUnicode((uint) keys, 0, keyboardState, buf, 256, 0);
return buf.ToString();
}
Console.WriteLine(GetCharsFromKeys(Keys.E, false, false)); // prints e
Console.WriteLine(GetCharsFromKeys(Keys.E, true, false)); // prints E

// Assuming British keyboard layout:
Console.WriteLine(GetCharsFromKeys(Keys.E, false, true)); // prints é
Console.WriteLine(GetCharsFromKeys(Keys.E, true, true)); // prints É

اما انچنان متوجه این کد ها نشدم میشه توضیح بدین دوستان اگر امکانش هم باشه با یک مثال عملی

این تابع :
WinAPI.ToUnicode
هم نیست!! اخطار میده
تشکر

plus
شنبه 31 خرداد 1393, 16:48 عصر
این تابع موجوده نمیدونم چرا به شما اخطار میده.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646320(v=vs.85).aspx
برای توضیحات بیشتر به همین لینک MSDN مراجعه کنید.
ولی در کل من متوجه نمیشم چرا شما میخواین از GetAsyncKeyState استفاده کنید؟ و کلا هدفتون چی هست؟

v30sharp
شنبه 31 خرداد 1393, 22:14 عصر
میخوام با استفاده از apiویندوز دکمه های فشار داده شده کاربر در هر کجای ویندوز رو در تکست باکس نشون بدم کنم

plus
شنبه 31 خرداد 1393, 23:07 عصر
میتونید از Windows Hook استفاده کنید.در گوگل و یا همینجا جستجو کنید.