PDA

View Full Version : سوال: باز کردن و بستن یک برنامه اجرایی بطور متوالی بعد از جند ثانبه



1234
شنبه 28 شهریور 1388, 18:21 عصر
سلام خدمت دوستان عزیز و مهربان و مدیران عزیز و زحمت کش : لطفا کمکم کنین ممنون
من در یک Timer قسمت Invertal گفتم که هر 30 ثانیه یک برنامه exe که همون اینترنت اکسپلورر باشه اجرا بشه اما این برنامه رو تا اینجا باکمک دوستان مدیران انجام دادم به صورت زیر

کد:
System.Diagnostics.Process.Start("explorer.exe
اما می خوام یک شرط هم براش بزارم که بعد از هر سی ثانیه اونی که قبلی باز شده بود بسته بشه و بعدا سایت بعدی باز بشه یعنی توی هر سی ثانیه که یک اینترنت اکسپلورر باز می شه اینترنت اکسپلورر قبلی که load شده بسته بشه
اگه لطف کنین راه حلشو بگین خیلی ممنون می شم
با تشکر فراوان
asiyeh_kh20@yahoo.com

Saeed.Masoumi
یک شنبه 29 شهریور 1388, 02:25 صبح
سلام
اگه بخوای پنجره رو ببندی باید هندلینگ کنی با استفاده از API تایتل پنجره قبلی که بازکردی رو بدست بیاری و ببنیدیش توی سایت بگرد پیدا میکنی
یک راه دیگه هم اینه که تسک مربوط به اینترنت اکسپلورپر رو ببندی من کاندش رو می نویسم بگر ببین معادلش تو سی شارپ چیه


taskkill /Im /F Iexplore.exe

بعدشم مطمینی با دستوری که نوشتی اینترنت اکسپلورر باز میشه؟:متفکر:
اون دستوری که نوشتی My computer رو به صورت Windows Explorer باز میکنی

1234
یک شنبه 29 شهریور 1388, 05:33 صبح
bale barname dorost ejra mishe
api ro az kodom site peyda konam
mamnon

corona
یک شنبه 29 شهریور 1388, 09:15 صبح
دوست من برای انجام این کار به Api هیچ نیازی نداری چرا الکی کار خودت رو سخت کنی .. کافیه که هر 30 ثانیه پراسس های سیستم رو بگیری با استفاده از کلاس Process و تابع GetProcesses() که در فضای نام System.diagnostic هستش و بعد چک کنی که اگه IE باز بود پراسسش رو Kill کنی و بعد IE بعدی خودت رو لود کنی .

Saeed.Masoumi
یک شنبه 29 شهریور 1388, 15:09 عصر
کافیه که هر 30 ثانیه پراسس های سیستم رو بگیری با استفاده از کلاس Process و تابع GetProcesses() که در فضای نام System.diagnostic هستش و بعد چک کنی که اگه IE باز بود پراسسش رو Kill کنی و بعد IE بعدی خودت رو لود کنی .
سلام
درسته دوست عزیز این روش رو من هم گفتم ولی یک اشکالی داره که بهتر از همون api استفاده شه چون امکان داره کاربر چند تا صفحه دیگه هم باز کرده باشه یا به فرض همه صفحات توی یکی باز شه (New tab) بعد اونوقت یک ذره مشکل ساز میشه
هرچند باز هم بستگی داره برای چه کاری بخواد در هر صورت هر دو تا راه رو می شه استفاده کرد

1234
یک شنبه 29 شهریور 1388, 18:54 عصر
سلام آقای معصومی عزیز از کمکتون ممنونم :
ببخشید که سوال تکراری می پرسم آخه من یک مبتدی هستم
اما نمی دونم چطوری از هندلینک استفاده کنم یعنی منظورتون اینه که یک تابع برای هند لینک بنویسم ؟
بعدش آیا api یک dll یا component هست ؟ و چطوری تو برنامه ازش استفاده کنم ؟ در ضمن اصل برنامه من اینه که اینترنت اکسپلورر توسط برنامه باز بشه و کاربر آدرس مورد نظر خودشو که وارد کرد و سایت بعد از سی ثانیه load شد اونوقت بسته بشه و یک انترنت اکسپلور دیگه باز بشه تا کاربر آدرس جدیدشو وارد کنه همش همینه
اگه کمکم کنین خیلی خیلی ممنون می شم البته من اگه بتونم هر دو روش رو امتهان می کنم
باز هم ممنون

Saeed.Masoumi
یک شنبه 29 شهریور 1388, 23:33 عصر
سلام
ببین با روش زیر می شه اون مشکل روش Kill رو حل کرد
اول این رو به اول پروژت اضافه کن:


using System.Diagnostics;
using System.Collections;

بعد این دستورات رو هرجا می خوای استفاده کن (مثلا رویداد کلیک):



ArrayList al = new System.Collections.ArrayList(0);
Process[] p;
p = Process.GetProcessesByName("Iexplore");
for (int i = 0; i < p.Length; i++)
{
al.Add(p[i].Id);
}
Process.Start("iexplore");
System.Threading.Thread.Sleep(1000);
Process[] p2;
p2 = Process.GetProcessesByName("Iexplore");
for (int i = 0; i < p2.Length; i++)
{
if (!al.Contains(p2[i].Id))
p2[i].Kill();
}


حالا برات توضیح می دم چه کار میکنه:
میاد پروسس های کنونی سیستم رو پردازش می کنه و پروسس ایدی مربوط به Iexplore.exe ها (اگر باز بودن) را بدست می آورد و در داخل یک لیست می نویسد سپس یک پنجره اینترنت اکسپلورر باز می شه و بعد از 1000 میلی ثانیه دوباره میاد پروسس های کنونی سیستم رو برای وجود پروسسی با نام Iexplore.exe جستجو می کنه بعد از پیدا شدن (حتما حداقل یکی وجود دارد چون یکی را خودمان باز کردیم) پروسس ایدی آن را بدست می آورد و با پروسس آیدی های دیگر که در لیست وجود دارد چک می شود (با این روش پروسس آیدی صفحه ای که باز کردیم را بدست می آوریم) در صورتی که پروسس آیدی وجود نداشت آن پروسس را کیل می کنیم البته احتمالا راحت تر می شد نوشت اما اینو فقط به عنوان نمونه نوشتم

1234
دوشنبه 30 شهریور 1388, 04:51 صبح
واقعا ممنونم

1234
دوشنبه 30 شهریور 1388, 05:14 صبح
حالا یه سوال دیگه
اگه بخوام این برنامه 5 تا صفحه وب رو توسط تایمر بعد هر سی ثانیه که باز کرد در ششمین صفحه kill کنه یعنی در هر صورت 5 صفحه باز باشه و اگه کاربر یک صفحه رو بست اونوقت یکی دیگه باز بشه تا بشه 5 تا صفحه وب برای این کار باید p.Length رو مساوی 5 قرار بدم ؟و البته آدرس صفحه وب مهم نیست چون در هر صورت همین برنامه می خواد صفحه وب باز کنه
کد این برنامه چه چیزهایی اضافه یا کم میشه ؟
ممنون

Saeed.Masoumi
دوشنبه 30 شهریور 1388, 14:17 عصر
سلام
ببین شما می خوای در هر صورت 5 تا اکسپلورر باز باشه؟
شما لازمه هر چند وقت یک بار بیای پروسس های فعال با نام Iexplore رو چک کنی اگه تعدادش بیشتر از 5 تا بود اونی که پروسس آی دیش از همه کهنه تر بود بسته بشه اینو دیگه می زارم خودت بنویسی :لبخند:(یک نکته کنکوری هر دفعه از دستور Add تو Arraylist استفاده کنی طول آرایه دوبرابر می شه پس می تونی این مقدار رو تقسیم بر دو کنی تا تعداد عضو ها رو بدست بیاری )
بعد در حین چک کردن یک شرط دیگه هم بزار که هر وقت تعدادشون کمتر از 5 بود یک اکس باز شه همین
در ضمن بهتره از تایمر معمولی استفاده نکنی از تایمر همروند استفاده کن بگرد نمونش رو می بینی "Thread" رو سرچ کن

1234
چهارشنبه 01 مهر 1388, 05:06 صبح
سلام دوستان عزیزم:
من این برنامه را براش نوشتم اما یک خطایی میده میشه کمکم کنید اون خطا رو برطرف کنم؟
( private void timer1_Tick(object sender, EventArgs e
}
; (ArrayList al = new System.Collections.ArrayList(0
; Process[] p
;( " p = Process.GetProcessesByName("Iexplore
} ; (++ for (int i = 0; i < p.Length; i
; ( al.Add(p[i].Id
{
; int j
; ( " Process.Start("iexplore
;( System.Threading.Thread.Sleep(10000
; Process[] p2
;(" p2 = Process.GetProcessesByName("Iexplore

( ++ for (j = 0; j < p2.Length; j
}
;j = p2.Length
( if (j < 5
;continue
else
}
(if (j > 5
}
if (!al.Contains(p2[j].Id))
}
p2[j].Kill();
{ {
{ { {