首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

编写一个程序,能实现定时关闭另一个程序。解决思路

2012-01-10 
编写一个程序,能实现定时关闭另一个程序。当指定的一个程序(如QQ)启动时,计时器启动,当程序运行10分钟后,程

编写一个程序,能实现定时关闭另一个程序。
当指定的一个程序(如QQ)启动时,计时器启动,当程序运行10分钟后,程序自动关闭,没有任何提示,直接关闭。
我自己写了一个,代码如下:
Private   Const   MAX_PATH   =   260
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   *   MAX_PATH
End   Type

Private   Declare   Function   CreateToolhelp32Snapshot   Lib   "kernel32 "   (ByVal   dwFlags   As   Long,   ByVal   th32ProcessID   As   Long)   As   Long
Private   Declare   Function   Process32First   Lib   "kernel32 "   (ByVal   hSnapshot   As   Long,   lppe   As   Any)   As   Long
Private   Declare   Function   Process32Next   Lib   "kernel32 "   (ByVal   hSnapshot   As   Long,   lppe   As   Any)   As   Long

Private   Const   TH32CS_SNAPHEAPLIST   =   &H1
Private   Const   TH32CS_SNAPPROCESS   =   &H2
Private   Const   TH32CS_SNAPTHREAD   =   &H4
Private   Const   TH32CS_SNAPMODULE   =   &H8
Private   Const   TH32CS_SNAPALL   =   (TH32CS_SNAPHEAPLIST   +   TH32CS_SNAPPROCESS   +   TH32CS_SNAPTHREAD   +   TH32CS_SNAPMODULE)
Private   Const   TH32CS_INHERIT   =   &H80000000


'Terminate   Process   Functions
Private   Declare   Function   TerminateProcess   Lib   "kernel32 "   (ByVal   hProcess   As   Long,   ByVal   uExitCode   As   Long)   As   Long
Private   Declare   Function   OpenProcess   Lib   "kernel32 "   (ByVal   dwDesiredAccess   As   Long,   ByVal   bInheritHandle   As   Long,   ByVal   dwProcessId   As   Long)   As   Long
Private   Declare   Function   CloseHandle   Lib   "kernel32 "   (ByVal   hObject   As   Long)   As   Long
Const   PROCESS_ALL_ACCESS   =   1


'提升权限
Private   Const   ANYSIZE_ARRAY   =   1
Private   Const   TOKEN_ADJUST_PRIVILEGES   =   &H20
Private   Const   TOKEN_QUERY   =   &H8
Private   Const   SE_PRIVILEGE_ENABLED   =   &H2
Private   Type   LUID
lowpart   As   Long
highpart   As   Long
End   Type
Private   Type   LUID_AND_ATTRIBUTES
pLuid   As   LUID
Attributes   As   Long
End   Type
Private   Type   TOKEN_PRIVILEGES
PrivilegeCount   As   Long
Privileges(ANYSIZE_ARRAY)   As   LUID_AND_ATTRIBUTES
End   Type
Private   Declare   Function   FindWindow   Lib   "user32 "   Alias   "FindWindowA "   (ByVal   lpClassName   As   Any,   ByVal   lpWindowName   As   String)   As   Long
Private   Declare   Function   SetSystemPowerState   Lib   "kernel32 "   (ByVal   fSuspend   As   Long,   ByVal   fForce   As   Long)   As   Long


Private   Declare   Function   GetCurrentProcess   Lib   "kernel32 "   ()   As   Long
Private   Declare   Function   OpenProcessToken   Lib   "advapi32 "   (ByVal   ProcessHandle   As   Long,   ByVal   DesiredAccess   As   Long,   TokenHandle   As   Long)   As   Long
Private   Declare   Function   LookupPrivilegeValue   Lib   "advapi32 "   Alias   "LookupPrivilegeValueA "   (ByVal   lpSystemName   As   String,   ByVal   lpName   As   String,   lpLuid   As   LUID)   As   Long
Private   Declare   Function   AdjustTokenPrivileges   Lib   "advapi32 "   (ByVal   TokenHandle   As   Long,   ByVal   DisableAllPrivileges   As   Long,   NewState   As   TOKEN_PRIVILEGES,   ByVal   BufferLength   As   Long,   PreviousState   As   TOKEN_PRIVILEGES,   ReturnLength   As   Long)   As   Long
Const   STANDARD_RIGHTS_REQUIRED   =   &HF0000
Const   TOKEN_ASSIGN_PRIMARY   =   &H1
Const   TOKEN_DUPLICATE   =   (&H2)
Const   TOKEN_IMPERSONATE   =   (&H4)

Const   TOKEN_QUERY_SOURCE   =   (&H10)

Const   TOKEN_ADJUST_GROUPS   =   (&H40)
Const   TOKEN_ADJUST_DEFAULT   =   (&H80)
Const   TOKEN_ALL_ACCESS   =   (STANDARD_RIGHTS_REQUIRED   Or   TOKEN_ASSIGN_PRIMARY   Or   _
TOKEN_DUPLICATE   Or   TOKEN_IMPERSONATE   Or   TOKEN_QUERY   Or   TOKEN_QUERY_SOURCE   Or   _
TOKEN_ADJUST_PRIVILEGES   Or   TOKEN_ADJUST_GROUPS   Or   TOKEN_ADJUST_DEFAULT)
Dim   HWND1   As   Long
Private   Sub   closeqq()
Dim   hSnapshot   As   Long,   lRet   As   Long,   P   As   PROCESSENTRY32
Dim   exitCode   As   Long
Dim   myProcess   As   Long
Dim   AppKill   As   Boolean

P.dwSize   =   Len(P)
hSnapshot   =   CreateToolhelp32Snapshot(TH32CS_SNAPALL,   ByVal   0)
If   hSnapshot   Then
lRet   =   Process32First(hSnapshot,   P)
Do   While   lRet
If   InStr(P.szExeFile,   "QQ.exe ")   <>   0   Then
myProcess   =   OpenProcess(PROCESS_ALL_ACCESS,   False,   P.th32ProcessID)
AppKill   =   TerminateProcess(myProcess,   exitCode)
Call   CloseHandle(myProcess)
Else:   Load   Form1
End   If
lRet   =   Process32Next(hSnapshot,   P)
Loop
lRet   =   CloseHandle(hSnapshot)
End   If
End   Sub
Private   Sub   Form_Load()
HWND1   =   FindWindow(0&,   QQ2007)
If   HWND1   <>   0   Then
Timer1.Enabled   =   True
End   If
End   Sub

Private   Sub   Timer1_Timer()
Static   i   As   Long
i   =   i   +   1
If   i   =   5   Then
Call   closeqq
End   If
End   Sub
当qq打开的时候,运行,过一会,qq会关掉。
但是,先运行程序,再打开qq,则qq不回自动关掉,而这与我的初衷不符,请问如何才能实现:先运行程序,然后打开qq,运行一段时间以后,qq自动关闭的效果呢?请高人指点。谢谢。

[解决办法]
Timer1.Enabled 在第二种情况下始终为False
楼主能用这些API,理论上这个问题不应该发现不料啊


[解决办法]
If HWND1 <> 0 Then
Timer1.Enabled = True

直接设定Enabled永远为True不就好了
[解决办法]
Private Sub Form_Load()
do while true
HWND1 = FindWindow(0&, QQ2007)
If HWND1 <> 0 Then
Timer1.Enabled = True
exit do
End If
sleep(10000)
loop
End Sub

热点排行
Bad Request.