PDA

View Full Version : وارد کردن متن در هر تکست باکسی !!



alnajon
پنج شنبه 09 آذر 1391, 20:25 عصر
با سلام ...

من تو برنامه ام یک باتون دارم ، میخواهم با زدن اون باتون موس تو هر جا که فوکوس کرده یه متنی رو وارد کنه !!

منظورم فقط توی برنامه نیست !! منظورم تو هر جای ویندوز که بشه متنی رو وارد کرد هست !!

مثلا تو نت پد ، یاهو مسنجر ، نوار ادرس مرورگر ، یا هر جای دیگه که موس روی اونجا فوکوس کرده ...

یعنی میشه گفت که مثل یه کیبرد عمل کنه !!

plus
پنج شنبه 09 آذر 1391, 20:35 عصر
شما باید از SendKeys.Send استفاده کنی و یا از توابع API مثل SendMessage.در کل استفاده از SendKeys.Send توصیه نمیشه.البته استفاده از SendMessage هم میتونه تبعات خودش رو داشته باشه.

alnajon
پنج شنبه 09 آذر 1391, 20:37 عصر
ببخشید من زیاد حرفه ای نیستم !!

میشه یک سورس یا کد بهم بدید بهتر متوجه میشم !!

میخواهم یه چیزی مثلا کیبورد مجازی خود ویندوز بشه ولی به جای کل دکمه های کیبورد فقط یک دکمه داشته باشم با یک متن

plus
پنج شنبه 09 آذر 1391, 21:20 عصر
شما اول باید کاری کنید که فرمتون با فشردن دکمه فعال نشه وگرنه نمیتونید کاری که میخواهین رو بکنید.واسه این کار از توابع API استفاده میشه.بعد از اون، شما میتونی روی رویداد کلیک دکمه از SendKeys.Send استفاده کنید:


public Form1()
{
InitializeComponent();
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) | WS_EX_NOACTIVATE);
}

private void button2_Click(object sender, EventArgs e)
{
SendKeys.Send(textBox1.Text);
}


private void textBox1_MouseDown(object sender, MouseEventArgs e)
{
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) & ~WS_EX_NOACTIVATE);
Activate();
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) | WS_EX_NOACTIVATE);
}


private const int WS_EX_NOACTIVATE = 0x08000000;
private const int GWL_EXSTYLE = -20;
[DllImport("user32.dll")]
public static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll")]
public static extern int GetWindowLong(IntPtr hWnd, int nIndex);

using System.Runtime.InteropServices; رو هم اضافه کنید.

alnajon
پنج شنبه 09 آذر 1391, 21:53 عصر
دست شما درد نکنه !!

ولی من هر کاری میکنم فرم با زدن دکمه فعال میشه و فوکوس از تکست باکس مورد نظر در میاد !!

:متفکر:

s3rv3r
پنج شنبه 09 آذر 1391, 21:58 عصر
خب مهندس شما وقتی کلیک میکنی فوکوس میاد رو دکمت دیگه
به عبارت دیگه فوکوس موس رو باتن هستش

نباید فوکوس فعلی که رو دکمت میشه در نظر بگیری

aradrobo
پنج شنبه 09 آذر 1391, 22:17 عصر
بیا . این دقیقاً همون چیزیه که می خواستی . ببین خوبه ؟

plus
پنج شنبه 09 آذر 1391, 23:20 عصر
دست شما درد نکنه !!

ولی من هر کاری میکنم فرم با زدن دکمه فعال میشه و فوکوس از تکست باکس مورد نظر در میاد !!

:متفکر:

من همین کد رو توی فرم میگذارم و فوکوس رو مثلا میبرم روی نت پد و دکمه رو از توی فرم میزنم فرم فعال نمیشه.شما یه فرم جدید بساز و یک دکمه و Text بنداز توش دوباره امتحان کن شاید مشکل از تنظیمات خاصی باشه که برای فرم یا کنترل هاش کردی.

zeinabrezaee
پنج شنبه 09 آذر 1391, 23:54 عصر
من میخوام این پروژه رو انجام بدم یه باتن و یه تکست گذاشتم تو فرمم اما plus چرا از این خط خطا میگیرهSetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) | WS_EX_NOACTIVATE); یوزینگ رو که هم دادی اضاف کردم

plus
جمعه 10 آذر 1391, 02:29 صبح
من میخوام این پروژه رو انجام بدم یه باتن و یه تکست گذاشتم تو فرمم اما plus چرا از این خط خطا میگیرهSetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) | WS_EX_NOACTIVATE); یوزینگ رو که هم دادی اضاف کردم

من اشتباهی موقع ویرایش پست، یکی از Constant ها رو حذف کرده بودم، کد رو اصلاح کردم دوباره بررسی کنید.

mhq1368
جمعه 10 آذر 1391, 08:22 صبح
با سلام
من کد دوست عزیزمون plus رو به شکل زیر نوشتم البته همون کده ولی توی mousehover قرارش دادم



private void textBox1_MouseHover(object sender, EventArgs e)
{
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) & ~ WS_EX_NOACTIVATE);
Activate();
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) | WS_EX_NOACTIVATE);
textBox1.Focus();
}



ولی فقط توی فرم جواب میده

plus
جمعه 10 آذر 1391, 13:39 عصر
با سلام
من کد دوست عزیزمون plus رو به شکل زیر نوشتم البته همون کده ولی توی mousehover قرارش دادم



private void textBox1_MouseHover(object sender, EventArgs e)
{
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) & ~ WS_EX_NOACTIVATE);
Activate();
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) | WS_EX_NOACTIVATE);
textBox1.Focus();
}



ولی فقط توی فرم جواب میده

دوست عزیز اون کدی که من برای TextBox گذشتم برای این بود که فرم، فقط در صورتی که کاربر روی TextBox کلیک کرد فعال بشه (و روی دکمه کلیک کرد فعال نشه).
--
نمیدونم چرا شما جواب نمیگیرید. آپلودش کردم.روش کار هم این هست که اجرا که کردید، روی TextBox خود برنامه کلیک میکنید، یک متنی وارد میکنید، بعد NotePad رو باز میکنید و روش کلیک میکنید تا فوکوس بگیره، بعد روی دکمه روی فرم کلیک میکنید

alnajon
شنبه 11 آذر 1391, 18:44 عصر
plus (http://barnamenevis.org/member.php?8256-plus) عزیز بالاخره درست شد !!

ولی یه مشکل دیگه هم هست !!

شما تو تکست باکس توی برنامه وقتی فارسی تایپ میکنی " سلام " و اون دکمه رو میزنی به جای سلام میزنه " sghl " !!!

و یک سوال دیگه : دکمه بک اسپیس رو چطور باید ساخت !؟

plus
شنبه 11 آذر 1391, 19:54 عصر
درسته SendKeys، فقط کلید ها رو Send میکنه و فارسی تایپ شدن یا انگلیسی تایپ شدن بسته به این داره که توی مقصد، Keyboard Layout فارسی باشه یا انگلیسی.مثلا اگه شما بری توی همون NotePad کیبرد رو فارسی کنی، سلام که فرستاده میشه به صورت فارسی نمایش داده میشه.
{BackSpace} نشانگر کلیک BackSpace هست.لیست کامل اینجا هست: http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx
ولی در کل SendKeys چیزی نیست که بدرد یک برنامه بخوره، چون این روش ارسال متن اصلا قابل اعتماد نیست.همینطور که دیدید در مورد کیبرد فارسی مشکل داشت...