PDA

View Full Version : حرفه ای: استفاده از سایر برنامه ها در برنامه ی خودمان (تاپیک شماره 2 )



omid-vbAuto
جمعه 26 آذر 1389, 15:36 عصر
با سلام خدمت دوستان

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




ولی تو این تاپیک یه کار هائی کردم که میزارم شما هم ببینید:

صورت مسئله همون عنوانن تاپیک هست .کدهای زیر رو هم تو load برنامه ای(برنامه 1 ) قرار دادم که می خوام تو برنامه ی دیگم (برنامه 2) از اون استفاده کنم.





If Environment.GetCommandLineArgs(0).ToString = "WindowsApplication74.vshost.exe" Then
Exit Sub
End If
Dim parameters As String = Environment.GetCommandLineArgs(1)
TextBox1.Text = parameters




کد زیر رو هم برای برنامه دومم قرار دادم:





Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
System.Diagnostics.Process.Start("WindowsApplication74.exe", "2")
End Sub





خوب دوستان تا این مرحله برنامه به خوبی و خوشی اجرا میشه.:خجالت:

و اما مشکل :

اگر توجه کنید تو برنامه دوم با کد System.Diagnostics.Process.Start برنامه رو اجرا و پارامتر 2 رو به Textbox برنامه یک می فرستیم.حالا اگه بخواهیم تعداد پارانترهای زیادی رو برای برنامه اول تعریف کنیم مشکلی پیش نمی آید (یعنی بیایم و برای برنامه اول یه Textbox دیگه اضافه کنیم و تو کدهاشم یه پارمتر دیگه اضافه کنیم)

ولی حالا نمی دونم چطوری با دستور System.Diagnostics.Process.Start پارامتر دوم رو به برنامه ی اول بفرستم.


لطفا کمک کنید.

omid-vbAuto
جمعه 26 آذر 1389, 17:07 عصر
دوستان همکاری کنن.لطفا

یا خیلی آسونه که ما رو هم در جریان بگذارید و یا خیلی سخته که کسی جواب نداده!

hero4000
شنبه 27 آذر 1389, 12:03 عصر
فکر مي کنم توي کد زير 5 رو به عنوان پارامتر دوم حساب مي کنه ( حتما تست کن چون مطمئن نيستم )


System.Diagnostics.Process.Start("WindowsApplication74.exe", "2 5")

omid-vbAuto
شنبه 27 آذر 1389, 15:16 عصر
فکر مي کنم توي کد زير 5 رو به عنوان پارامتر دوم حساب مي کنه ( حتما تست کن چون مطمئن نيستم )


System.Diagnostics.Process.Start("WindowsApplication74.exe", "2 5")



مهندس جان خیلی ممنونم ازتون زدین وسط خال :چشمک:


فقط یه مشکل دیگه دارم و اونهم اینه:

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

حالا برای حل این مشکل چه راه حلی به فکرتون میرسه؟

hero4000
یک شنبه 28 آذر 1389, 08:06 صبح
دوست عزيز اگه ميخواي برنامه با پارامترهاش اجرا بشه خوب بايد يک Shortcut از فايل اجرائي بسازي و اونوقت توي آدرس فايل به آخر آدرس هر پارامتري که ميخواي بنويسي

ولي اگه ميخواي اگر برنامه بدون پارامترم اجرا شد مشکل نخوره کافيه که اولا اونجايي که پارامتر رو لازم داري از يک متغير عمومي استفاده کني و در فرم لود برنامه هم مقدار پارامترها رو توي اون متغيره بريزي و يک شرط بنويسي که اگه پارامتر نداشت مقدار اون متغير ها رو پيش فرض يک چيزي قرار بده

بازم اگه سوالي بود در خدمتم

omid-vbAuto
یک شنبه 28 آذر 1389, 15:16 عصر
دوست عزيز اگه ميخواي برنامه با پارامترهاش اجرا بشه خوب بايد يک Shortcut از فايل اجرائي بسازي و اونوقت توي آدرس فايل به آخر آدرس هر پارامتري که ميخواي بنويسي

ولي اگه ميخواي اگر برنامه بدون پارامترم اجرا شد مشکل نخوره کافيه که اولا اونجايي که پارامتر رو لازم داري از يک متغير عمومي استفاده کني و در فرم لود برنامه هم مقدار پارامترها رو توي اون متغيره بريزي و يک شرط بنويسي که اگه پارامتر نداشت مقدار اون متغير ها رو پيش فرض يک چيزي قرار بده

بازم اگه سوالي بود در خدمتم



مهندس جان (hero4000) دستتون درد نکنه از اینکه کمک می کنید.ولی سطح بالا توضیح می دین من هم متوجه نشدم منظورتون چی بود؟



دوست عزيز اگه ميخواي برنامه با پارامترهاش اجرا بشه خوب بايد يک Shortcut از فايل اجرائي بسازي و اونوقت توي آدرس فايل به آخر آدرس هر پارامتري که ميخواي بنويسي



منظورتون از Shortcut چیه ؟ مگه نمی تونیم به خود فایل EXE اشاره کنیم؟(یکم بیشتر توضیح بدین)




ولي اگه ميخواي اگر برنامه بدون پارامترم اجرا شد مشکل نخوره کافيه که اولا اونجايي که پارامتر رو لازم داري از يک متغير عمومي استفاده کني و در فرم لود برنامه هم مقدار پارامترها رو توي اون متغيره بريزي و يک شرط بنويسي که اگه پارامتر نداشت مقدار اون متغير ها رو پيش فرض يک چيزي قرار بده



مهندس برنامه وقتی که بالا می آد تو رخداد LOAD خودش برا خودش پارامتر تولید می کنه.و بعدش هم سریعا مقدارهای پارامترو می خواد از دستور زیر بگیره:




System.Diagnostics.Process.Start("WindowsApplication74.exe", "2")


پس برنامه به اونجائی نمیرسه که ما بیایم براش متغییر عمومی تعریف کنیم!!!


البته شاید تجزیه و تحلیل من غلط باشه.اگر براتون مقدوره یه نمونه کد بذارید.تا سایر دوستان هم استفاده کنن.

با تشکر

hero4000
دوشنبه 29 آذر 1389, 12:04 عصر
دوست عزيز اين هم يک مثال
توي شاخه Bin يک Shortcut هم هست ازش پروپرتي بگير در تب دوم قسمت Target رو نگاه بنداز تا متوجه بشي چجوري پارامتر ارسال ميشه

63850

omid-vbAuto
دوشنبه 29 آذر 1389, 18:42 عصر
دوست عزيز اين هم يک مثال
توي شاخه Bin يک Shortcut هم هست ازش پروپرتي بگير در تب دوم قسمت Target رو نگاه بنداز تا متوجه بشي چجوري پارامتر ارسال ميشه

63850

مهندس خیلی جالب بود ممنون.

مشکلم به کلی حل شد :لبخندساده: :تشویق::تشویق:

ولی کاربر که نمی تونه از اینجور کار ها بکنه منظورم جمله پایینتونه:(در کل ما از این Shortcut چه استفاده ی مفیدی میتونیم تو برناممون بکنیم؟)



توي شاخه Bin يک Shortcut هم هست ازش پروپرتي بگير در تب دوم قسمت Target رو نگاه بنداز تا متوجه بشي چجوري پارامتر ارسال ميشه




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

مهندس جان یه سوال تازه هم به ذهنم رسیده که اونهم با اجازتون مطرح می کنم:

فکر کنید ما با دستور زیر یه برنامه ی خاصی مثل Word یا Winamp را باز کردیم . حالا چطوری می تونیم ببندیمشون البته با کد.



System.Diagnostics.Process.Start

hero4000
سه شنبه 30 آذر 1389, 08:06 صبح
از بحث Process ها استفاده کن

هر برنامه اي که باز مي کني يک پروسس داره که مي توني اون رو Kill کني تا بسته بشه ( البته بهتره کاربر خودش اون رو ببنده چون اگر تغييري داده باشه و شما اينجوري ببنديش تغييراتش ذخيره نمي شن)

omid-vbAuto
سه شنبه 30 آذر 1389, 08:18 صبح
از بحث Process ها استفاده کن

هر برنامه اي که باز مي کني يک پروسس داره که مي توني اون رو Kill کني تا بسته بشه ( البته بهتره کاربر خودش اون رو ببنده چون اگر تغييري داده باشه و شما اينجوري ببنديش تغييراتش ذخيره نمي شن)

مهندس جان کد Kill کردن یه Process رو می تونید بگید؟

hero4000
چهارشنبه 01 دی 1389, 08:19 صبح
Dim p As Process
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
p = Process.Start("WinWord.exe")
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
p.Kill()

End Sub

omid-vbAuto
چهارشنبه 01 دی 1389, 08:59 صبح
مهندس خیلی ممنونم من تا اینجا جواب سوالمو تمام وکمال گرفتم.

ولی:

اگه بخواهیم بدون ایجاد یه Process اون Process موجود رو Kill کنیم میشه؟؟؟

یعنی اگه کاربر خودش اقدام به اجرای برنامه Word کنه.ما می تونیم اونو Kill کنیم؟اگه آره کد بدین.

با تشکر

omid-vbAuto
پنج شنبه 02 دی 1389, 00:28 صبح
دوستان عزیز منتظر پاسختون هستم.

hero4000
پنج شنبه 02 دی 1389, 08:14 صبح
Dim p() As Process = Process.GetProcessesByName("Winword")
For i = 0 To p.Length - 1
p(i).Kill()
Next

omid-vbAuto
پنج شنبه 02 دی 1389, 10:06 صبح
Dim p() As Process = Process.GetProcessesByName("Winword")
For i = 0 To p.Length - 1
p(i).Kill()
Next




مهندس جان خدایش کارتون حرف نداره.مرسی:تشویق::تشویق::تشو یق:


حالا اگه بخواهیم کل processهای سیستم رو بدست بیاریم و انها رو بریزیم تو Listbox و یکی از انها رو به جای ("Winword") بذاریم .میشه؟؟؟

اگه ممکنه در این باره نیز مارو کمک کنید . اگه با یه مثال یا یه کد باشه بهتره.

omid-vbAuto
پنج شنبه 02 دی 1389, 14:17 عصر
دوست عزیز آقای Hero4000 با توجه به راهنمائی های ارزشمند شما ما تونستین در هنگام لود شدن یک برنامه براش پارامتر بسازیم و مقادیر این پارامترهارو از طریق یه برنامه دیگه بفرستیم.

حالا مشکل من اینکه:

فکر کنید پارامتر ارسالی من به برنامه 2 می بایست چندین بار و آنهم با مقادیر مختلف ارسال شود.بطور مثال:

در مرحله اول برنامه 1 پارامتر "53" رو به برنامه 2 می فرسته.تا اینجای کار مشکل نداریم.حالا اگه بخواهیم این پارامتر ارسالی رو آپدیت کنیم(منظور من ارسال پارمتر دوم نیست ها،همون پارامتر اولی که فرستاده شده رو ویرایش کنیم چه کار باید کرد؟)

البته یه فکری به ذهنم رسیده و اونهم اینه که بیایم برنامه دوم رو Kill کنیم و سیس با پارمتر مورد نظرمان بفرستیم.که این ایراد زیر رو داره:
1- ممکنه این عمل 200 تا 300 بار تکرار بشه که باید برناممون به این تعداد باز و بسته بشه که صحیح نیستش.
2- وقتی برنامه بسته میشه اون پارامتر قبلی هم از دست میره که نمی خوام اون از دست بره.


برای این مشکل چه راهکاری رو و چه کدی رو باید در پیش بگیرم؟ با تشکر

omid-vbAuto
جمعه 03 دی 1389, 06:04 صبح
دوستان بد نمیشه شما هم به یکی از دو سوال بالا پاسخ بدید.

با تشکر.

hero4000
شنبه 04 دی 1389, 10:48 صبح
دوست عزيز شما براي ارسال پارامتر نيازي نيست که همش به اين شکل عمل کنيد

خيلي راحت يک فايل متني توي شاخه برنامه و يا ويندوز بسازيد و اونرو توي اون فايل بنويسيد و توي برنامه دوم بخونيدش



حالا اگه بخواهیم کل processهای سیستم رو بدست بیاریم و انها رو بریزیم تو Listbox و یکی از انها رو به جای ("Winword") بذاریم .میشه؟؟؟

اگه ممکنه در این باره نیز مارو کمک کنید . اگه با یه مثال یا یه کد باشه بهتره.

يک Button و يک ComboBox به فرمت اضافه کن و دستورات زير رو بنويس


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim p() As Process = Process.GetProcesses
For i = 0 To p.Length - 1
ComboBox1.Items.Add(p(i).ProcessName)
Next
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim p() As Process = Process.GetProcessesByName(ComboBox1.Text)
For i = 0 To p.Length - 1
p(i).Kill()
Next
End Sub

omid-vbAuto
شنبه 04 دی 1389, 14:18 عصر
دوست عزيز شما براي ارسال پارامتر نيازي نيست که همش به اين شکل عمل کنيد

خيلي راحت يک فايل متني توي شاخه برنامه و يا ويندوز بسازيد و اونرو توي اون فايل بنويسيد و توي برنامه دوم بخونيدش




بله آقای مهندس این هم یه راهشه ، ولی می خوام این کارو به طور مداوم و بدون تولید فایل متنی انجام بدم.مثل حالت لود فرم.؟؟؟:متفکر:

و پیوسته و در صورت نیاز پارامتر رو فرستاد.

omid-vbAuto
یک شنبه 05 دی 1389, 08:15 صبح
دوستان عزیز یه کم کمک :عصبانی++:

hero4000
یک شنبه 05 دی 1389, 08:21 صبح
دوست عزيز اگه نميخواي فايل درست کني ميتوني از رجيستري استفاده کني ولي اينکه بخواي از پارامتر استفاده کني حرف زوره

اگه ميخواي مستقيم با برنامه ارتباط برقرار کني ميتوني از SetWindowText استفاده کني ( توي تالار زياد بحث شده )

اين رويه ميتونه به يک تکستباکس ديگه توي يک پنجره ديگه متني رو ارسال کنه و شما هم ميتونيد دستورات خودتون رو توي رويداد TextChange اون تکستباکس بنويسيد

omid-vbAuto
یک شنبه 05 دی 1389, 09:33 صبح
دوست عزيز اگه نميخواي فايل درست کني ميتوني از رجيستري استفاده کني ولي اينکه بخواي از پارامتر استفاده کني حرف زوره

اگه ميخواي مستقيم با برنامه ارتباط برقرار کني ميتوني از SetWindowText استفاده کني ( توي تالار زياد بحث شده )

اين رويه ميتونه به يک تکستباکس ديگه توي يک پنجره ديگه متني رو ارسال کنه و شما هم ميتونيد دستورات خودتون رو توي رويداد TextChange اون تکستباکس بنويسيد


با توجه به راهنمائی های شما به کدهای زیر رسیدم اما یه تغییراتی توش دادم و گذاشتم برا برنامه 1 :




Private Declare Function GetForegroundWindow Lib "user32" () As Integer
Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Integer



و بعدش هم تو یه دکمه ی برنامه 1 کد زیر رو گذاشتم :




Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
SetWindowText(GetForegroundWindow, "hello")
End Sub




که هیچی در مورد کداش نمی دونم.فقط کدهاشو کپی کردم.مثلا نمی دونم اینها یعنی چی؟


SetWindowTextA
SetWindowText
GetForegroundWindow


این از این.تازه من نمی دونم برا برنامه دوم چه کدهائی رو بکار ببرم؟:افسرده:

کلا موندم لطفا کمک کنید.

hero4000
دوشنبه 06 دی 1389, 09:37 صبح
دوست عزيز من خيلي توي اين زمينه کارنکردم فقط يکم اطلاعات دارم که اميدوارم درست باشه

ببينيد شما اول بايد هندل فرم برنامه دومتون رو بدست بياريد ( فکر مي کنم GetForegroundWindow هندل فرم فعال بالايي رو پس ميده ) بعدش بايد متن رو به تکس باکسي که در نظر داري بفرستي ( فکر ميکنم SetWindowText عنوان فرم رو تغيير ميده )

توي فرم دومت هم بايد توي رويداد تکستچنج دستورات خودت رو بنويسي ( همون دستوراتي که قراره روي پارامتر ارسالي عمل کنه )

اميدوارم اطلاعات ناقصم بتونه کارت رو راه بندازه :قلب:

hero4000
دوشنبه 06 دی 1389, 10:00 صبح
راستي فکر ميکنم دوستمون Saman_12 روي اين قضيه بيشتر کار کردند و آدم دست و دلبازي هم هستند ( هر اطلاعاتي داشته باشند بي دريغ در اختيار بقيه قرار مي دهند )

omid-vbAuto
دوشنبه 06 دی 1389, 15:10 عصر
راستي فکر ميکنم دوستمون Saman_12 روي اين قضيه بيشتر کار کردند و آدم دست و دلبازي هم هستند ( هر اطلاعاتي داشته باشند بي دريغ در اختيار بقيه قرار مي دهند )

مهندس رفتم یه نامه خصوصی دادم ببینیم چی میشه.


مهندس می تونید کد زیر رو برام توضیح بدین ؟ تو قسمت p.Length - 1 اشکال دارم.هر چه ساده تر بهتر.مگه Pرو به عنوان Process تعریف نمی کنیم؟ پس چرا انداختینش تو یه حلقه FOR ؟؟؟



Dim p() As Process = Process.GetProcessesByName("Winword")
For i = 0 To p.Length - 1
p(i).Kill()
Next

Saman_12
دوشنبه 06 دی 1389, 17:52 عصر
مهندس رفتم یه نامه خصوصی دادم ببینیم چی میشه.


مهندس می تونید کد زیر رو برام توضیح بدین ؟ تو قسمت p.Length - 1 اشکال دارم.هر چه ساده تر بهتر.مگه Pرو به عنوان Process تعریف نمی کنیم؟ پس چرا انداختینش تو یه حلقه FOR ؟؟؟



Dim p() As Process = Process.GetProcessesByName("Winword")
For i = 0 To p.Length - 1
p(i).Kill()
Next



اگه توجه کرده باشین P به عنوان یک آریه تک بعدی تعریف شده و p.Length - 1 ایندکس آخرین خانه آرایه رو بر میگردونه یعنی آخرین پروسسی که توی آریه ذخیره شده.

حلقه For هم برای اینه که تک تک عضو های P پردازش بشن و همه Kill بشن.(پروسس ها با نام یکسان میتوند اجرا بشند پس ممکنه تعداد زیادی پروسس با یک نام در حال فعالیت باشند.)
حلقه میاد و ایندکس اولین عضو آرایه که همون 0 هست رو تا p.Length - 1 رو توی i ذخیره میکنه و هر دفعه یک خونه از آرایه رو میخونه.

omid-vbAuto
دوشنبه 06 دی 1389, 19:26 عصر
اگه توجه کرده باشین P به عنوان یک آریه تک بعدی تعریف شده و p.Length - 1 ایندکس آخرین خانه آرایه رو بر میگردونه یعنی آخرین پروسسی که توی آریه ذخیره شده.

حلقه For هم برای اینه که تک تک عضو های P پردازش بشن و همه Kill بشن.(پروسس ها با نام یکسان میتوند اجرا بشند پس ممکنه تعداد زیادی پروسس با یک نام در حال فعالیت باشند.)
حلقه میاد و ایندکس اولین عضو آرایه که همون 0 هست رو تا p.Length - 1 رو توی i ذخیره میکنه و هر دفعه یک خونه از آرایه رو میخونه.


آیا می تونیم اینطوری نتیجه بگیریم که حلقه For می آد و کلیه ی پنجره های باز اون برنامه خواص رو پیدا می کنه و شروع به Kill کردن میکنه؟و همچنین میشود حلقه رو این طوری شمرد؟ از 1 تا P.Length ؟

Saman_12
دوشنبه 06 دی 1389, 20:04 عصر
آیا می تونیم اینطوری نتیجه بگیریم که حلقه For می آد و کلیه ی پنجره های باز اون برنامه خواص رو پیدا می کنه و شروع به Kill کردن میکنه؟و همچنین میشود حلقه رو این طوری شمرد؟ از 1 تا P.Length ؟

کلیه پنجره های برنامه خاص نه؟!
بلکه کلیه پنجره هایی که نام پروسس شون Winword هست.

آره میشه اما در صورتی که تا P.Length-1 شمرده شه ولی این طوری اولین برنامه ای که توی آرایه ذخیره شده بسته نمیشه.(فکر کنم در صورتی که پنجره ای با این نام وجود نداشته باشه این تیکه کد در زمان اجرا خطا تولید کنه.),چون اولین خانه آرایه ها 0 هست توی VB6 میشد کاری کرد اولین خانه از 1 باشه نه 0 ولی توی دات نت این امکان وجود نداره.

hero4000
سه شنبه 07 دی 1389, 10:02 صبح
کلیه پنجره های برنامه خاص نه؟!
بلکه کلیه پنجره هایی که نام پروسس شون Winword هست.

آره میشه شمرد ولی این طوری اولین برنامه ای که توی آرایه ذخیره شده بسته نمیشه.(فکر کنم در صورتی که پنجره ای با این نام وجود نداشته باشه این تیکه کد در زمان اجرا خطا تولید کنه.)چون اولین خانه آرایه ها 0 هست توی VB6 میشد کاری کرد اولین خانه از 1 باشه نه 0 ولی توی دات نت این امکان وجود نداره.

نه دوست عزيز چون هم اولين پروسس رو Kill نميکنه و همچنين به آخرين عنصر ( که همون P.Length هستش ) که برسه خطا ميده که از آرايه خارج شده ( ميتونين امتحان کنين )

omid-vbAuto
سه شنبه 07 دی 1389, 15:17 عصر
نه دوست عزيز چون هم اولين پروسس رو Kill نميکنه و همچنين به آخرين عنصر ( که همون P.Length هستش ) که برسه خطا ميده که از آرايه خارج شده ( ميتونين امتحان کنين )


خوب حرف شما متین .فکر کنید ما فقط یه برنامه یعنی فقط در یک پنجره Word رو باز کردیم. پس تعداد پروسس ما یکی میشه.پس تو حلقه به مشکل می خوریم که چون حلقه از 0 شروع میشه و به p.Length - 1 ختم میشه. و با توجه به حرفهای سامان جان اولین پروسس مقدارش صفره پس نتیجه ی p.Length - 1 برابر 1- میشه.پس حلقه خطا میده چون از 0 تا 1- هست.می تونید در این مورد راهنمائی کنید؟

hero4000
چهارشنبه 08 دی 1389, 08:19 صبح
جناب Saman_12 من از شما توقع بيشتر از اينها رو داشتم :متعجب:

شما کدي رو که گذاشته بودين رو دقت کنين بنده گفتم



نه دوست عزيز چون هم اولين پروسس رو Kill نميکنه و همچنين به آخرين عنصر ( که همون P.Length هستش ) که برسه خطا ميده که از آرايه خارج شده ( ميتونين امتحان کنين )


شما هم همينو ميگين



اگر چند تا پروسس با این نام وجود داشته باشند اولیشون رو Kill نمیکنه


پس شما دارين حرف من رو توي اين قسمت تاييد ميکنين

در مورد قسمت دوم هم بنده گفتم



نه دوست عزيز چون هم اولين پروسس رو Kill نميکنه و همچنين به آخرين عنصر ( که همون P.Length هستش ) که برسه خطا ميده که از آرايه خارج شده ( ميتونين امتحان کنين )


توي گفته بنده دقت کنيد من گفتم اگر انتهاي حلقه رو برابر P.Length قرار بدين (توي پست 27 ) يعني کد زير



Dim Proces() As Process = Process.GetProcessesByName("Notepad")

For Index As Integer = 1 To Proces.Length

Proces(Index).Kill()
Next



شما اگه پنجره نوتپد باز نباشه که اصلا توي حلقه نميره ولي اگر يکي هم باز باشه ميره و خطا هم ميده ( حتما امتحان کنيد تا بحث ادامه پيدا نکنه )

من توي اين قسمت بحثم سر قسمت انتهايي حلقه بود که دوستمون omid-vbAuto گفته بودند



آیا می تونیم اینطوری نتیجه بگیریم که حلقه For می آد و کلیه ی پنجره های باز اون برنامه خواص رو پیدا می کنه و شروع به Kill کردن میکنه؟و همچنین میشود حلقه رو این طوری شمرد؟ از 1 تا P.Length ؟


و شما هم جواب داده بوديد



آره میشه شمرد ولی این طوری اولین برنامه ای که توی آرایه ذخیره شده بسته نمیشه.(فکر کنم در صورتی که پنجره ای با این نام وجود نداشته باشه این تیکه کد در زمان اجرا خطا تولید کنه.)چون اولین خانه آرایه ها 0 هست توی VB6 میشد کاری کرد اولین خانه از 1 باشه نه 0 ولی توی دات نت این امکان وجود نداره.

در صورتي که نميشه اينطوري استفاده کرد و اگر پنجره اي به اين نام وجود نداشته باشه هم خطا نمي ده ( چون اصلا وارد حلقه نميشه )

اميدوارم سوء تفاهمتون برطرف شده باشه :قلب:

hero4000
چهارشنبه 08 دی 1389, 08:32 صبح
خوب حرف شما متین .فکر کنید ما فقط یه برنامه یعنی فقط در یک پنجره Word رو باز کردیم. پس تعداد پروسس ما یکی میشه.پس تو حلقه به مشکل می خوریم که چون حلقه از 0 شروع میشه و به p.Length - 1 ختم میشه. و با توجه به حرفهای سامان جان اولین پروسس مقدارش صفره پس نتیجه ی p.Length - 1 برابر 1- میشه.پس حلقه خطا میده چون از 0 تا 1- هست.می تونید در این مورد راهنمائی کنید؟

دوست عزيز وقتي شما از P.lenght-1 استفاده مي کنين و يک برنامه باز کردين P.lenght برابر 1 مي باشد پس P.lenght-1 برابر 0 مي باشد و حلقه از 0 تا 0 شروع به شمردن ميکنه و يکبار وارد حلقه ميشه و اولين پروسس که شمارش صفر هستش رو Kill ميکنه پس همون يک برنامه بسته خواهد شد

راستي دوست عزيز مگه شما اون دستوري رو که من گذاشتم رو تست نکردين ؟ مگه باهاش مشکلي خورده بودين که فکر کردين اشتباه ميگم ؟ کاشکي اول توي حالات مختلف با تعداد پروسسهاي مختلف تستش ميکردين بعد زير سوال مي بردينم :متعجب:

بازم اگه سوالي بود در خدمتم

پاورقي :
در ضمن من اگه توي جايي اطلاعاتم ناقص باشه شما رو راهنمايي نمي کنم و به يک کسي که وارده ارجاعتون ميدم همانطور که توي بحث هندل پنجره ها به دوستمون Saman_12 ارجاعتون دادم .

Saman_12
چهارشنبه 08 دی 1389, 13:37 عصر
جناب Saman_12 من از شما توقع بيشتر از اينها رو داشتم :متعجب:

شما کدي رو که گذاشته بودين رو دقت کنين بنده گفتم



شما هم همينو ميگين



پس شما دارين حرف من رو توي اين قسمت تاييد ميکنين

در مورد قسمت دوم هم بنده گفتم



توي گفته بنده دقت کنيد من گفتم اگر انتهاي حلقه رو برابر P.Length قرار بدين (توي پست 27 ) يعني کد زير



Dim Proces() As Process = Process.GetProcessesByName("Notepad")

For Index As Integer = 1 To Proces.Length

Proces(Index).Kill()
Next



شما اگه پنجره نوتپد باز نباشه که اصلا توي حلقه نميره ولي اگر يکي هم باز باشه ميره و خطا هم ميده ( حتما امتحان کنيد تا بحث ادامه پيدا نکنه )

من توي اين قسمت بحثم سر قسمت انتهايي حلقه بود که دوستمون omid-vbAuto گفته بودند



و شما هم جواب داده بوديد


در صورتي که نميشه اينطوري استفاده کرد و اگر پنجره اي به اين نام وجود نداشته باشه هم خطا نمي ده ( چون اصلا وارد حلقه نميشه )

اميدوارم سوء تفاهمتون برطرف شده باشه :قلب:

مثل اینکه سوء تفاهم شده!!(مشکل از چشمهای منه آخه میدونید تازگی ها یکمی ضعیف شده!)
کلی عذر خواهی میکنم من هواسم به آخر جمله نبود :

p.Length - 1
p.Length رو p.Length - 1 خوندم خوب دیگه استرس باعث هواس پرتی و ... میشه.(شما به بزرگی خودتون ببخشید به هر حال اشتباه پیش میاد اما ,بخشش از حرفه ای تر هاست.)
در مورد جمله اول هم ,منظور من دقیقا تاکیید بر جمله شما بوده و اصل مطلب همون اشتباه منه که اگر نمی شد چی می شد؟!!!
رسیدم سر جمله سوم!خوب اینم نصفش همون اشتباه است بقیش هم اگر توجه کرده باشید گفتم :

فکر کنم در صورتی که پنجره ای با این نام وجود نداشته باشه این تیکه کد در زمان اجرا خطا تولید کنه.
خوب من هنوز این رو امتحان نکرده بودم به همین دلیل هم از لفظ شکی استفاده کردم!(باز هم ببخشید گفتم که استرس پدر آدم رو در آورده.)

omid-vbAuto
چهارشنبه 08 دی 1389, 17:39 عصر
راستي دوست عزيز مگه شما اون دستوري رو که من گذاشتم رو تست نکردين ؟ مگه باهاش مشکلي خورده بودين که فکر کردين اشتباه ميگم ؟ کاشکي اول توي حالات مختلف با تعداد پروسسهاي مختلف تستش ميکردين بعد زير سوال مي بردينم :متعجب:

اتفاقا دستوراتی رو که شما دادین تا حالا حتی یه ایراد کوچولو برا شوخی هم نداشته :لبخند:.ولی من خواستم یکمی به کمک دوستان عزیز شروع به ماهیگیری کنم.که اشتباهی قلابم رفتش تو یه لنگه کفش کهنه.:لبخند:

Hero و سامان عزیز از کمکهاتون صمیمانه تشکر می کنم.مخصوصا از Hero که از اول تاپیک بنده رو همراهی کردن.