PDA

View Full Version : سوال: Virtual KeyBoard صفحه کلید مجازی



MehdiElexal
پنج شنبه 25 تیر 1394, 15:05 عصر
با سلام دوستان من میخوام یک کیبرد مجازی مثل OSK ویندوز بسازم ، منتها میخوام وقتی ماوس روی یک تکتس باکس فوکوس کرده من روی مثلا دکمه (ب) برنامه (کی برد) زدم روی همون تکتس باکس فوکوس کنه تا کد ارسال از کیبرد روش اعمال شه و فوکوس روی دکمه تغییر نکنه ( دقیقا مثل OSK) یا به عبارتی دکمه ها فوکوس نشن اصلا
با تشکر از همگی

pbm_soy
جمعه 26 تیر 1394, 15:55 عصر
میتوانید مقدار رشته را بطور کامل از کی برد مجازی بگیرید و به یکباره مقدار را به تکستباکس انتساب دهد

MehdiElexal
جمعه 26 تیر 1394, 18:39 عصر
ممنون بابت پاسختون ولی من دقیقا یک کیبرد دارم که روی باتن های حروف هاش کلیک میشه و نمیتونم مقدار رشته رو کامل بگیرم و کپی کنم ، میخوام واقعا مثل کیبرد OSK کار کنه و باتن ها فوکوس نداشته باشن
تشکر

MehdiElexal
جمعه 26 تیر 1394, 18:41 عصر
شما یک برنامه رو در نظر بگیرید که یک باتن داره داخلش کد
SendKeys.SendWait("{آ}");
هست
و زمانی که روی تکتس باکس میزنید بعد از زدن روی دکمه باید حرف (آ) داخل تکتس جای گذاری شه
نمیخوام توش بنویسم text1.text=آ
اینو میدونم میخوام مثل کیبرد مجازی کار کنه و حرف پاس داده بشه نه انتصاب

khokhan
جمعه 26 تیر 1394, 18:58 عصر
شما یک برنامه رو در نظر بگیرید که یک باتن داره داخلش کد
SendKeys.SendWait("{آ}");
هست
و زمانی که روی تکتس باکس میزنید بعد از زدن روی دکمه باید حرف (آ) داخل تکتس جای گذاری شه
نمیخوام توش بنویسم text1.text=آ
اینو میدونم میخوام مثل کیبرد مجازی کار کنه و حرف پاس داده بشه نه انتصاب


.................................................. ...

MehdiElexal
شنبه 27 تیر 1394, 15:25 عصر
تشکر ولی این مثال هم گفته داخل تکتس باکس بنویسه ، شایدم بنده اشتباه متوجه شده باشم
من نمیخوام بگن تو تکتس باکس X بنویس
من هر لحظه یک جا فوکوس داره برنامم و میخوام اونجا تایپ شه ، مثل کیبرد که کار نداره کجا مینویسه فقط پاس میده کد ها رو
منم نمیخوام بگم تو تکتس 1 بنویس الف میخوام اونجایی که فوکوس هست بنویسه و اینکه فارسی رو پشتیبانی کنه
داخل این مثال نویشته شده
richTextBox1.Focus();
SendKeys.Send(e.KeyboardKeyPressed);
خب داره روی ریچ باکس فوکوس میکنه ینی فرقی با richbox=A نداره
نمیخوام اشاره به جایی کنم میخوام جایی که فوکوس بوده حروف اونجا تایپ شن
تشکر

Saman_12
شنبه 27 تیر 1394, 22:38 عصر
با استفاده از API ه GetWindowLong (و مقدار GWL_EXSTYLE) استایل پنجره رو با WS_EX_NOACTIVATE ترکیب کنید و از اول ست کنید (SetWindowLong)

abdullah20
شنبه 27 تیر 1394, 23:09 عصر
دوستمون یه کیبورد مجازی مثل ویندوز می خوان
من قبلا یکی نوشته بودم اگر پیدا کردم براتون قرار می دم

MehdiElexal
شنبه 27 تیر 1394, 23:33 عصر
با تشکر از توجهتون
سامان من متوجه نشدم عرضتون رو اگر امکان داره یه مثال عملی بدید
آقا عبدالله بله کاملا درست متوجه شدید دقیقا مثل OSK(on screen keyboard) خود ویندوز که هرجا فوکوس هست همونجا تایپ میکنه ، ممنون میشم اگر پیدا کردید این لطف رو در حق من کنید
تشکر

Saman_12
یک شنبه 28 تیر 1394, 04:44 صبح
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int GetWindowLong(IntPtr hwnd, int index);


[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle);


private const int WS_EX_NOACTIVATE = 0x08000000;
private const int GWL_EXSTYLE = -20;


private void SetToNOACTIVE(IntPtr hwnd)
{
int style = GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_NOACTIVATE;
SetWindowLong(hwnd, GWL_EXSTYLE, style);
}


private void Form1_Load(object sender, EventArgs e)
{
SetToNOACTIVE(this.Handle);
}


این رو تو استک دیدم :

protected override CreateParams CreateParams
{
get
{
CreateParams param = base.CreateParams;
param.ExStyle |= WS_EX_NOACTIVATE;
return param;
}
}

MehdiElexal
یک شنبه 28 تیر 1394, 11:52 صبح
سامان ممنون ، میشه لینک مطلب رو بدی ؟ گیر کردم تو استفادش ، میتونی راهنمایی کنی ؟ پیاده کردمش منتها نمیدونم به کدوم تابع حروف رو پاس بدم برای تایپ :گریه:
ممنون میشم راهنماییم کنی

MehdiElexal
یک شنبه 28 تیر 1394, 12:37 عصر
دوستان من تا الان کلی لینک بالا پایین کردم که خیلی هاشون اونی که میخواستم نبود ، ممنون میشم نمونه برنامه کوچیک حتی با یه دکمه قرار بدید
تشکر

Saman_12
یک شنبه 28 تیر 1394, 16:52 عصر
http://stackoverflow.com/questions/2969680/c-sharp-showing-form-with-ws-ex-noactivate-flag

دقیقا شما کجاش رو مشکل داری؟ پنجره که دیگه active نمیشه کافیه شما با sendkeys یا keybd_event یا setinput یا setwindowtext بقیه کار هارو انجام بدی(سه تا آخری API اند اولی کلاس دات نته.)

MehdiElexal
یک شنبه 28 تیر 1394, 22:04 عصر
سامان ممنون واقعا عالی کار میکنه خارج فرم
ولی من تکتس باکس هام توفرمه :افسرده:
چند تا تکتس باکسه زیرش یه کی برد مجازی ، میخوام رو هر تکتس باکسی که زد کی برد مجازی توش بنویسه ، بعد تب بندی شده خیلی تکتس باکسه ، برای صفحه تاچ اسکرینه ، بخوام قسمت بندی کنم و متغییر کمکی بذارم خیلی سخت میشه ، میخوام رو هر تکتس که زد بعد با کی بردی که پایین فرمه ولی تو دل همون فرمه بتونه تکتس های مربوطه رو پر کنه
به جای اینکه فوکوس فرم غیر فعال شه جاش فوکوس باتن غیر فعال شه همه چی حله
ممنون که تایپیک رو دنبال میکنید ، مخصوصا شما آقا سامان عزیز

Saman_12
یک شنبه 28 تیر 1394, 22:32 عصر
شما کیبردمجازی رو برای برنامه خودتون میخوایید؟ فعلا ساده ترین کار اینه که فرم کیبرد مجازی رو جدا طراحی کنید و فقط کلید ها روش باشه.

MehdiElexal
یک شنبه 28 تیر 1394, 22:42 عصر
ببخشید من سوالم رو بد مطرح کردم شرمنده :افسرده::افسرده:
یه سیستم تاچه قسمت بالاش کلی تکتس باکسه پایینشم باید یه کیبرد مجازی باشه برای اون تکتس باکس ها ، اگر یکی دو تا بود با if حلش میکردم خیلی تکتس هست
نمیشه جای اینکه فرم غیر فعال شه دکمه ها غیر فعال شن ؟
خیلی بد میشه اینجوری خب :افسرده: من زیاد وارد نیستم شما استاد هسنید ببینید شاید راهی برای این کار باشه
بازم ببخشید بابت بد مطرح کردن سوالم فکر میکردم تو پست 4 منظورم واضح باشه ولی اشتباه فکر میکردم
در هر صورت ممنون میشم به این صورت کمک کنید مساله حل شه
بازم تشکر

Saman_12
یک شنبه 28 تیر 1394, 22:58 عصر
یه کلاس باید از button مشتق کنید و برای دکمه ها از اون استفاده کنید جای دکمه های پیشفرض :

class NoSelectButton : Button
{
public NoSelectButton()
{
SetStyle(ControlStyles.Selectable, false);
}
}

​پانوشت:لینکش یادم نیست شرمنده جناب نویسنده.

MehdiElexal
دوشنبه 29 تیر 1394, 12:37 عصر
یه کلاس باید از button مشتق کنید و برای دکمه ها از اون استفاده کنید جای دکمه های پیشفرض :

class NoSelectButton : Button
{
public NoSelectButton()
{
SetStyle(ControlStyles.Selectable, false);
}
}

​پانوشت:لینکش یادم نیست شرمنده جناب نویسنده.


ممنون سامان از لطفی که داری
فقط من یکم آماتورم میشه بگی چطور اینکارو کنم ؟ ینی چطور مشتق کنم دکمه رو ؟
چطور ازش استفاده کنم ؟؟ یه مثال میشه بزنی ؟ ممنون:قلب:

MehdiElexal
دوشنبه 29 تیر 1394, 12:44 عصر
تا به اینجای کار رو ضمیمه کردم برای دوستانی که میخوان کی برد مجازی رو خارج فرم داشته باشن مثالش به این صورت هست

سامان من داخل این فایل 5 تا تکتس گذاشتم میشه رو این ضمیمه بگی چطور دکمه رو مشتق کنم که اون تکتس باکس ها بشه داخلشون با اون دکمه نوشت
واقعا ممنون که این پست رو ثمر رسوندی ...

Saman_12
دوشنبه 29 تیر 1394, 13:22 عصر
درمورد کلاس و ارثبری حتما تحقیق کنید :

MehdiElexal
دوشنبه 29 تیر 1394, 13:30 عصر
بسیار عالی و ممنون از زحمات بسیاری که بابت این تایپیک کشیدید و نتیجه داد ، خیلی ممنون

negar.rafie
پنج شنبه 02 مهر 1394, 16:39 عصر
سلام
داشتم روش ساخت صفحه کلید مجازی را یاد میگرفتم رسیدم به این تاپیک
حالا اگر بخوایم برای مقدار دهی اون تکس باکس ها از یک فرم دیگه اقدام کنیم باید چکار کنیم؟
یعنی دکمه ها روی اون فرمی که تکی باکس ها هستند نباشند و در یک فرم دیگه باشند؟
دقیقا مثل osk ویندوز

abdullah20
شنبه 04 مهر 1394, 07:47 صبح
از کدی که اقا سامان دادن استفاده کنید ولی خاصیت انتخاب شدن دکمه ها غیر فعال کنید چون اگر حتی کاری کنید که فرم فعال نشه اگر دکمه های فعال بشن فایده نداره