PDA

View Full Version : سوال: یک سوال درباره Shell و Feedback آن



mpmsoft
پنج شنبه 24 مرداد 1387, 09:44 صبح
دوستان می خوام از برنامم یک فایل اجرایی رو اجرا کنم می خوام تا زمانی که اون برنامه کارش تموم نشده برنامه من قفل بشه.

مثال :

Add or Remove Program ویندوز رو در نظر بگیرید
وقتی روی دکمه Unistall کلیک می کنیم برنامه Unistall باز شده و نکته اینه که خوده پنجره Add or Remove قفل می شه تا زمانی که کاره حذف نرم افزار انجام بشه.

یا مثال دیگه ما وقتی پنجره ای رو بصورت ShowModal باز می کنیم دقیقا همین اتفاق میافته.


فقط دقت کنید که من می خوام یک فایل Exe رو اجرا کنم ، فرمی رو از داخل برنامه نمی خوام

xxxxx_xxxxx
پنج شنبه 24 مرداد 1387, 09:53 صبح
يك راه پيش پا افتاده اينه كه يك تايمر بزاري و caption پنجره هاي فعال رو چك كني اگر پنجره موردنظر فعال بود اونوت فرم رو قفل كني.

ميشه از تايمر هم استفاده نكرد بستگي به برنامه داره كه شما مي دونيد اون فايل exe كي اجرا ميشه يا نه.

البته من كوچيكتر از اوني هستم كه بخوام شما رو راهنمايي كنم.

موفق باشيد.

mahmood3d
پنج شنبه 24 مرداد 1387, 10:03 صبح
مي توني وقتي كه فرم مورد نظرت رو باز مي كني فرم قبلي تو تا موقعي كه فرم جديدتو نبستي غير فعال نگهداري . براي مثال اگر فرم اصليت frmMain و فرم جديدت frmNew باشه توي يكي از اجزاي frmMain مي توني بنويسي frmNew.Show 1 اون يكي كه بعد از frmNew.Show مي نويسي فرم قبلي يعني frmMain تو رو تا زماني كه فرم جديدت بازه قفل مي كنه

mpmsoft
پنج شنبه 24 مرداد 1387, 10:45 صبح
دوست عزیز اگر دقت کنید من عرض کردم خدمتتون که نمی خوام فرمی رو نمایش بدم به قول فرمایش شما همون Form1.Show 1 جواب کاره منو می ده ولی من سوالم چیزه دیگست و مثالی که زدم فکر می کنم مکفی باشه.می خوام فایل Exe رو اجرا کنم تا زمانی که کاره فایل EXE انجام نشده برنامه من کاری انجام نده

reza_optical
پنج شنبه 24 مرداد 1387, 12:20 عصر
سلام دوست عزیز
شما اگر برای فایلی که میخواین execute کنین یه فرم به صورت vbmodal باز کنید و کنترلهای فرم رو هم بردارید min,max,close و برای اجرا exe از command button استفاده کنی و هنگامی که میخوایی دستورات رو اجرا کنی enabel دگمه رو false کن و وقتی که پنجره فایل exe در حال اجرا است enabel دگمه هم false وقتی کار exe تموم شد میتونی دگمه های خروج و دوباره اجرا کردن exe رو enabel رو true کنی همین و به قول دوستمون با timer هم میتونی فعال یا غیر فعال بودن پنجر فایل اجرایی رو چک کنید

با آرزوی سر بلندی

mpmsoft
پنج شنبه 24 مرداد 1387, 12:30 عصر
1 - اگر قرار بود با فایل اجرایی در ارتباط باشم که روشهای خیلی بهتری هم هست
2 - اسم یا عنوان پنجره فایل اجرایی رو ندارم
3 - نمی خوام حتی تایمرهای نرم افزار کار کنه
4 - فایل اجرایی یک فایل نصبی هستش که باید یک فایل مورد نیاز رو نصب کنه

xxxxx_xxxxx
پنج شنبه 24 مرداد 1387, 12:35 عصر
پس از فايل exe چه چيزي در اختيار دارين تا بتونين از طريق اون كنترل رو دست بگيرين؟

xxxxx_xxxxx
دوشنبه 28 مرداد 1387, 12:55 عصر
اين دقيقا همون چيزي كه شما مي خوان:
بدون نياز به تايمر.

اين كد رو داخل ماژول قرار بديد:



Private Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type

Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
End Type

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CreateProcessA Lib "kernel32" (ByVal lpApplicationName As Long, ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const INFINITE = -1&

Public Sub ExecCmd(cmdline$)
Dim proc As PROCESS_INFORMATION
Dim start As STARTUPINFO
start.cb = Len(start)
ret& = CreateProcessA(0&, cmdline$, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc)
ret& = WaitForSingleObject(proc.hProcess, INFINITE)
ret& = CloseHandle(proc.hProcess)
End Sub


حالا اونجايي كه مي خواين اون فايل exe رو به اين صورت اجرا كنيد:



ExecCmd "c:\windows\system32\calc.exe"



اينجا برنامه ماشين حساب ويندوز رو در نظر مي گيريم كه تا زماني كه ماشين حساب بسته نشود نمي توانيم از برنامه استفاده كنيم.

موفق باشيد