PDA

View Full Version : بستن برنامه های در حال اجرا



roo.row
سه شنبه 16 تیر 1394, 11:38 صبح
با سلام خدمت دوستان
می خواستم بدونم که چجوری ممکن برنامه های در حال اجرا رو ببندم
ترجیحا از sendkeys استفاده نشه و همچنین می خوام بتونم بدونم
کد هندل و دونستن اسم برنامه همه ی برنامه هارو ببندم
با تشکر

meys34
سه شنبه 16 تیر 1394, 18:09 عصر
سلام

به صورت کلی میشه این:

target_hwnd = FindWindow(vbNullString, TitleText)

SendMessage target_hwnd, WM_CLOSE, 0, 0

به هر حال پیداکردن hwnd مساله اصلی هست
و باید title یا class پنجره رو داشته باشید (البته در صورت ثابت بودن مکان با استفاده از موقعیت هم میشه)

roo.row
سه شنبه 16 تیر 1394, 22:59 عصر
با سلام
و تشکر فراوان
ممنون ولی راهی نیست هر برنامه ای که تو اون لحظه باز بود بسته بشه ؟

pbm_soy
چهارشنبه 17 تیر 1394, 00:51 صبح
میتوانید با استفاده از api های ویندوز اینکار را انجام دهید
ویا با استفاده از دستورات ویندوز انجام دهیدمثلا ویندوز دستور tasklist و taskkill دارد الان ویندوز ندارم دقیقا چک کنم
شما این دستورات را از داخل وی بی اجرا میکنید مثلا
Tasklist >list.txt این دستور را توسط تابع shell اجرا میکنید فایلی با نام list.txt ایجاد میشود که حاوی لیست تمام برنامه های در حال اجراست حالا فایل را باز کنید ودخط به خط بخوانید و اسم و آی دی پراسس دلخواه را از توش پیدا کنید
حالل با استفاده از آی دی پراسس موردنظر و دستور taskkill برنامه را قطع کنید این دستور را هم باید با shell اجرا کنید

pbm_soy
چهارشنبه 17 تیر 1394, 02:16 صبح
یا اینکه از api ها ویندوز استفاده کنید به روش زیر

این ماژول خوب با چند تابع خوب با استفاده از apiهای ویندوز برای کار با پراسسها و برنامه های در حال اجرا


Option Explicit

Private Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Private Declare Function CloseHandle Lib "Kernel32.dll" (ByVal Handle As Long) As Long
Private Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
Private Declare Function EnumProcesses Lib "psapi.dll" (ByRef lpidProcess As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
Private Declare Function GetModuleFileNameExA Lib "psapi.dll" (ByVal hProcess As Long, ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As Long) As Long
Private Declare Function EnumProcessModules Lib "psapi.dll" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long

Private Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String * 260
End Type

Private Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type

Private Const PROCESS_TERMINATE = &H1
Private Const VER_PLATFORM_WIN32_WINDOWS = 1
Private Const PROCESS_QUERY_INFORMATION = 1024
Private Const PROCESS_VM_READ = 16
Private Const TH32CS_SNAPPROCESS = &H2

Private Function CheckVersion() As Long
Dim tOS As OSVERSIONINFO
tOS.dwOSVersionInfoSize = Len(tOS)
Call GetVersionEx(tOS)
CheckVersion = tOS.dwPlatformId
End Function

Private Function GetEXEProcessID(ByVal sEXE As String) As Long
Dim aPID() As Long
Dim lProcesses As Long
Dim lProcess As Long
Dim lModule As Long
Dim sName As String
Dim iIndex As Integer
Dim bCopied As Long
Dim lSnapShot As Long
Dim tPE As PROCESSENTRY32
Dim bDone As Boolean

If CheckVersion() = VER_PLATFORM_WIN32_WINDOWS Then
'Windows 9x
'Create a SnapShot of the Currently Running Processes
lSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
If lSnapShot < 0 Then Exit Function
tPE.dwSize = Len(tPE)
'Buffer the First Processes Info..
bCopied = Process32First(lSnapShot, tPE)
Do While bCopied
'While there are Processes List them..
sName = Left$(tPE.szExeFile, InStr(tPE.szExeFile, Chr(0)) - 1)
sName = Mid(sName, InStrRev(sName, "\") + 1)
If InStr(sName, Chr(0)) Then
sName = Left(sName, InStr(sName, Chr(0)) - 1)
End If
bCopied = Process32Next(lSnapShot, tPE)
If StrComp(sEXE, sName, vbTextCompare) = 0 Then
GetEXEProcessID = tPE.th32ProcessID
Exit Do
End If
Loop

Else
'Windows NT
'The EnumProcesses Function doesn't indicate how many Process there are,
'so you need to pass a large array and trim off the empty elements
'as cbNeeded will return the no. of Processes copied.
ReDim aPID(255)
Call EnumProcesses(aPID(0), 1024, lProcesses)
lProcesses = lProcesses / 4
ReDim Preserve aPID(lProcesses)

For iIndex = 0 To lProcesses - 1
'Get the Process Handle, by Opening the Process
lProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, aPID(iIndex))
If lProcess Then
'Just get the First Module, all we need is the Handle to get
'the Filename..
If EnumProcessModules(lProcess, lModule, 4, 0&) Then
sName = Space(260)
Call GetModuleFileNameExA(lProcess, lModule, sName, Len(sName))
If InStr(sName, "\") > 0 Then
sName = Mid(sName, InStrRev(sName, "\") + 1)
End If
If InStr(sName, Chr(0)) Then
sName = Left(sName, InStr(sName, Chr(0)) - 1)
End If
If StrComp(sEXE, sName, vbTextCompare) = 0 Then
GetEXEProcessID = aPID(iIndex)
bDone = True
End If
End If
'Close the Process Handle
CloseHandle lProcess
If bDone Then Exit For
End If
Next
End If
End Function

Public Function TerminateEXE(ByVal sEXE As String) As Boolean
Dim lPID As Long
Dim lProcess As Long

lPID = GetEXEProcessID(sEXE)
If lPID = 0 Then Exit Function
lProcess = OpenProcess(PROCESS_TERMINATE, 0, lPID)
Call TerminateProcess(lProcess, 0&)
Call CloseHandle(lProcess)

TerminateEXE = True
End Function


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


Private Sub cmdCloseApp_Click()
Dim blnRet As Boolean
blnRet = TerminateEXE("Woof.exe")
If Not blnRet Then
MsgBox "Terminate failed!"
End if
End Sub

pbm_soy
چهارشنبه 17 تیر 1394, 02:18 صبح
این هم روش دیگر با استفاده از wmi


Private Sub Command1_Click()
TerminateProcess ("calc.exe")
End Sub

Private Sub TerminateProcess(app_exe As String)
Dim Process As Object
For Each Process In GetObject("winmgmts:").ExecQuery("Select Name from Win32_Process Where Name = '" & app_exe & "'")
Process.Terminate
Next
End Sub

roo.row
چهارشنبه 17 تیر 1394, 13:59 عصر
با سلام
و تشکر فراوان
ببخشید روش پایداری وجود نداره ( بعد از بستن برنامه همان گونه بماند )

meys34
چهارشنبه 17 تیر 1394, 14:44 عصر
سلام

با تشکر از کد های دوستان...

اگر میخواید برنامه اجرا نشه باید فایل اجرایی رو از کار بندازید...
مثلا میتونید: 1- پاکش کنید 2- اسمش رو تغییر بدید 3- داخل فایل رو جوری تغییر بدید که دیگه اجرا نشه

مورد سومی:
برنامه ای برای جلوگیری از اجرای بقیه برنامه ها (http://barnamenevis.org/showthread.php?146661-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%A7%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AC%D9%84%D9%88%DA%AF%DB%8C%D8%B1%DB%8C-%D8%A7%D8%B2-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-%D8%A8%D9%82%DB%8C%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7)