PDA

View Full Version : سوال: فشردن کلیک یا .. در یک برنامه که خود ان را ننوشته ایم



mehrdad1991h
شنبه 20 مهر 1392, 21:37 عصر
سلام
یه برنامه مثلا داریم 10 تا تکست باکس داره میخوایم پرشون کنیم و نهایتا روی دکمه ی ورود اطلاعات کلیک کنیم

خوب مثلا تکست باکس ها را پر کردیم (یه جوری بالاخره با فایل کانفیگی چیزی...)
فقط میخوایم روی یکی از تکست باکس ها قرار بگیریم و اینتر را بزنیم که خودکار
کار فشردن دکمه ورود اطلاعات انجام بشه


چجوری امکان پذیر هست ؟

میدونم باید از API ویندوز استفاده کنم ولی میشه کسی یه مقدار مختصر توضیح بدهد که باید چه کنم اگر هم نمونه ای دارید لطف کنید بدید ممنون میشم

سپاس

FastCode
شنبه 20 مهر 1392, 21:40 عصر
http://stackoverflow.com/questions/9984770/using-sendmessage-to-enter-text-into-an-edit-control-belonging-to-another-proces

mehrdad1991h
شنبه 20 مهر 1392, 22:58 عصر
http://stackoverflow.com/questions/9984770/using-sendmessage-to-enter-text-into-an-edit-control-belonging-to-another-proces

سلام
دقیقا همین را خوندم
ولی متاسفانه هر کاری میکنم نمیشه !
یه نمونه هم درست کرد 1 تکست باکس گذاشتم و یک باتن
با یه برنامه دیگه میخوام بهش وصل بشم هر کاری میکنم نمیشه :((
چه کنم ؟
امکانش هست کسی یه نمونه ی انجام شده اگر پیدا کرده یا قبلا نوشته یا تونست بنویسه قرار بدهد که بشه بهش نگاه کرد فهمید چی شده . . .
سپاس

FastCode
یک شنبه 21 مهر 1392, 00:04 صبح
برنامه هدف چیه؟

juza66
یک شنبه 21 مهر 1392, 09:00 صبح
سلام

با برنامه AutoIt ميشه چنين كاري رو كرد ولي با سي شارپ رو نميدونم!

http://barnamenevis.org/showthread.php?279295-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D8%A7-AutoIt-3

erfan_urchin
یک شنبه 21 مهر 1392, 10:22 صبح
سلام
یه برنامه مثلا داریم 10 تا تکست باکس داره میخوایم پرشون کنیم و نهایتا روی دکمه ی ورود اطلاعات کلیک کنیم

خوب مثلا تکست باکس ها را پر کردیم (یه جوری بالاخره با فایل کانفیگی چیزی...)
فقط میخوایم روی یکی از تکست باکس ها قرار بگیریم و اینتر را بزنیم که خودکار
کار فشردن دکمه ورود اطلاعات انجام بشه


چجوری امکان پذیر هست ؟

میدونم باید از API ویندوز استفاده کنم ولی میشه کسی یه مقدار مختصر توضیح بدهد که باید چه کنم اگر هم نمونه ای دارید لطف کنید بدید ممنون میشم

سپاس

شما برو رو تکست باکس 10 و رویداد KeyPress رو انتخاب کن و کد زیر رو توش بنویس
private void textBox10_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 13)
button1_Click(null, null);
}
با این کد وقتی شما داخل تکست باس 10 هستید و Enter رو میزنید خود بخود رو Button کلیک میشه (به همین راحتی. هیچ نیازی هم به API نیست)

mehrdad1991h
دوشنبه 22 مهر 1392, 07:35 صبح
شما برو رو تکست باکس 10 و رویداد KeyPress رو انتخاب کن و کد زیر رو توش بنویس
private void textBox10_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 13)
button1_Click(null, null);
}
با این کد وقتی شما داخل تکست باس 10 هستید و Enter رو میزنید خود بخود رو Button کلیک میشه (به همین راحتی. هیچ نیازی هم به API نیست)

عزیز من این چیه دادی !
اینقدر نمیفهمم !؟

بابا 1 برنامه مثلا فرض کن اینترنت اکسپلورر یا کانکشن دایال اپ یا نوت پد یا ..... داریم
میخوایم با برنامه ای که نوشتم فیلد های مورد نظر انها را پر کنیم ! گرفتی ؟ لینکی که گذاشته بودن را اگر چک میکردی متوجه میشدی روشش همونه ولی من انجام میدم نمیشه !

mehrdad1991h
دوشنبه 22 مهر 1392, 07:39 صبح
برنامه هدف چیه؟

یه برنامه حسابداری است.

mehrdad1991h
دوشنبه 22 مهر 1392, 07:52 صبح
سلام

با برنامه AutoIt ميشه چنين كاري رو كرد ولي با سي شارپ رو نميدونم!

http://barnamenevis.org/showthread.php?279295-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D8%A7-AutoIt-3

با سی شارپ هم امکان پذیر هست
منتها کاری که میخوایم انجام بدیم اینه که دقیقا فیلد هایی که مد نظر داریم پر بشه وگرنه همینجوری ارسال یک کلید به برنمه مقصد کاری نداره !
میخوام مثلا تکست باکس را تشخیص بدهد و دقیقا مثلا یوزر نیم را با نام کاربری که در نظر داریم و نام کالا را با نامی که مشخص شده پر کنه
به این صورت که همینجوری برنامه اجرا بشه و یه سری کلید دریافت کنه مشکل ندارم ولی برخی مواقع مشکل پیش میاد (مثلا فوکوس روی نام کالا هستش و طبق الگویی که گذاشتیم اشتباه فیلد پر میشه
مثلا
فیلد 1 = نام
فیلد 2 = کالا
باتن
الگو :
mehrdad[tab]baghali[tab][enter]
در این حالت اگر فوکوس اول روی فیلد 1 باشه درست کار میکنه ولی اگر فوکوس روی نام کالا باشه نام کالا را میزنه مهرداد !!! چون فیلد را شناسایی نمیکنه همینجوری پارامتر ارسال میکنه کاری نداره کجا میفرسته من میخوام فیلد را بشناسه و دقیقا به همون فیلد بره و پر کنه
این کار هم با همون لینکی که دوستمون fastcode گذاشتن انجام پذیر هست نمونه های توضیح مشابه هم زیاد دیدم تو نت ولی متاسفانه این عمل به صورت عملی ندیدم جایی که بتونم به عنوان مثال ازش استفاده کنم فقط توضیح هست و با همون توضیحات هم من انجام دادم ولی نمیشه :(((
چه کنم ؟

mehrdad1991h
دوشنبه 22 مهر 1392, 20:39 عصر
نظری نبود ؟

drsina
دوشنبه 22 مهر 1392, 21:34 عصر
میتونی از sendkey ها استفاده کنی !!!
Sendkey.Sendwait .....

mehrdad1991h
سه شنبه 23 مهر 1392, 10:08 صبح
میتونی از sendkey ها استفاده کنی !!!
Sendkey.Sendwait .....
سلام
مشکل اینجاست که فیلد مقصد را چجوری تشخیص بدم
اصلا در نظر بگیرید یه فیلد یوزر داریم یه فیلد پسورد چجوری بفهمیم کدام یوزر هست کدام پسورد ؟
همه مشکل سر همینه

pedram.11
سه شنبه 23 مهر 1392, 11:11 صبح
سلام شما میتونید با برنامه هایی مثل spy++ اینکارو انجام بدید و نام اون کنترل رو بدست بیارید. وقتی که نام رو بدست آوردید با استفاده از تابع FindWindowEx میتونید هندل رو بدست بیارید و بعد با استفاده از SendMessage روش کنترل داشته باشیدو...

البته برای دسترسی به کنترلهایی مثل دکمه نیاز به نام نیست و میتونید با استفاده از تکست اون بهش دسترسی پیدا کنید

pedram.11
سه شنبه 23 مهر 1392, 11:25 صبح
این هم یک مثال که برنامه هندل فرم خودشو پیدا میکنه و دکمه خودشو هربار فشار میده. در رویداد دکمه هم زمان سیستم نمایش داده میشه.
توجه کنید برای تست، برنامه رو از پروژه با ویژوال اجرا نکنید چون نام برنامه تغییر میکنه و برای تست یا برنامه رو از پوشه ی Debug تست کنید و یا میتونید برنامه رو دوبار اجرا کنید که یکی از ویژوال استودیو و دیگری رو از همون پوشه Debug. دراینصورت با استفاده از برنامه ای که با ویژوال اجرا شده هندل برنامه دومی و بعدش هندل دکمه با متن Go پیدا میشه و در آخر هم با استفاده از متد SendMessage اون دکمه فشار داده میشه.

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SendMessage(IntPtr hwnd, uint Msg, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
//
const int BM_CLICK = 0x00F5;

private void button1_Click(object sender, EventArgs e)
{
this.Text = DateTime.Now.ToString();
new Thread(new ThreadStart(GetTopHandle)).Start();
}
void GetTopHandle()
{
Thread.Sleep(1000);
Process pr = Process.GetProcessesByName("PressAnotherApp_sButton")[0];
IntPtr ButtonHandle = FindWindowEx(pr.MainWindowHandle, IntPtr.Zero, null, "Go");
SendMessage(ButtonHandle, BM_CLICK, IntPtr.Zero, IntPtr.Zero);
}

برای راحتی کار هم میتونید پروژه رو دانلود کنید: