如何让程序非正常关闭后自动重新启动,一个名为《柳叶擦眼》的软件做到了,就是利用进程管理器将其结束,但是它马上会立刻启动,是怎么实现的?用了哪些API和技术?最好能给出代码。
解决方案 »
- 如何使某个子过程失效?
- 在VB中怎样使右上角的X不可用,而且按ALT+F4也不关闭窗口!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- CSDN论坛问题!
- 如何在窗体的BORDERSTYLE属性等于0时,在程序运行时在任务栏显示窗体
- 请问textbox控件为什么不能输入中文呢?我要输入中文该怎么办呀?
- 无影那份
- 在线等待 70 分---如何使我程序在运行期间使鼠标不可用 在某一位置不能动
- 请教:能够实现在图片框中再放置图片框后一起缩放吗?
- *******Help:vb中小数与百分数的转换************
- 请问如何支持滚轮鼠标,如支持在TEXTBOX中或LIST控件中的滚动!
- 感谢热情帮助,请chewinggum(口香糖)进来领分
- 请教各位大侠ado控件与access的编程
比如说《柳叶擦眼》是你想满足要求的程序!你另外再做一个程序,叫myapp吧!
在myapp加一个timer,interval设置为6!
然后用findwindow时刻查看当前的《柳叶擦眼》是否存在,如果不存在(即关闭了),
你就shell!
不知道是不是可以满足的要求,我的语文有问题,有点不懂你的意思了:(
A启动B 用Shell
然后用WaitForSingleObject ,当B结束返回A继续执行上个步骤。B 程序也可以作成DLL形式来加载,会更好。至于是否是异常退出,在B里判断后,传给A,A来决定时候重起。
我是今天注册的,新手!请多多关照!
你提供的程序完全没有这个功能!我在任务管理器中踢掉了进程,然后什么也没发生!
请问你是否使用的是Win9x或WinMe系统?如果是,那么可能仅仅是你看不到该程序的守望进程而已。该进程可能被注册成了系统服务。如果不是,请告诉我你的系统版本,我非常好奇这样的程序是什么原理!谢谢!
注:我的系统是WinXP sp1
可以试试这样行不行
程序加载后运行
SetUnhandledExceptionFilter AddressOf StartMe
在form的unload事件里执行
Dim k As Long
k = k / 0StartMe 是在模块里的过程
Sub StartMe ()
Shell 自己的程序
End
SetUnhandledExceptionFilter 申明
Public Declear Function SetUnhandledExceptionFilter Lib "...." (pTopLevelExceptionFilter As Long) As Long
因为手边没有VB,也没有些相应的工具,所以有些地方请大家补足
加入
Const EXCEPTION_EXECUTE_HANDLER = 1
StartMe 改成
Function StartMe () As Long
Shell 自己的程序
StartMe = EXCEPTION_EXECUTE_HANDLER
End
http://www.luocong.com/articles/show_article.asp?Article_ID=25
IIf Right(App.Path, 1) <> "\", Shell(App.Path & "\" & App.EXEName & ".exe"), Shell(App.Path & App.EXEName & ".exe")
End Sub
我有一个自己写的强行关闭程序的小东东,如果楼主要的话,晚上回家后可以Email给你...上面的程序没有调试,在公司上网,没法调试,应该没有问题
#注意,我的程序里都没有换行符
'一个标准工程,窗体上加一个Commandbox控件,名字为Command1
'in a Form,Add a commandbox,name Command1
Private Sub Command1_Click()
End
End Sub
Private Sub Form_Unload(Cancel As Integer)
If Right$(App.Path, 1) <> "\" Then
Shell (App.Path & "\" & App.EXEName & ".exe")
Else
Shell (App.Path & App.EXEName & ".exe")
End If
End Sub如果你真要屏蔽WM_CLOSE消息,自己写个钩钩,把WM_CLOSE消息废除就可以了给你一个简单的例子[不完整]'-----------------------截获消息模块
Function wndproc(ByVal Hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long '&H10就是WM_CLOSE消息
If msg = &H10 Then
If cAlock = False Then
Exit Function
End If
End If
'将消息返还给原进程
wndproc = CallWindowProc(PrevWndproc, Hwnd, msg, wParam, lParam)
End Function
If Right$(App.Path, 1) <> "\" Then
Shell (App.Path & "\" & App.EXEName & ".exe")
Else
Shell (App.Path & App.EXEName & ".exe")
End If
End Sub
以上这段程序虽然任务管理器不能关闭,但是《柳叶擦眼》可以的,所以没有真正的做到
你说屏蔽WM_CLOSE消息,那么只要程序运行着所有的WM_CLOSE不都失效了?!
你先设置一个没有“X”的界面。你自己写一个:
dim kk as longpublic sub lexit() '自己设置记号
kk=100
end
end sub然后在: '这说明是系统关闭
Private Sub Form_Unload(Cancel As Integer)
if kk<>100 then
'自己重启
endif
End Sub不知道我的想法行不行,还有问题的话就再问一次。
我试过
总能关掉
那软件也不行,我用《网络新手反黑客实用工具箱2.0》的关闭进程,就全部OVER
另想办法
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_CLOSE = &H10
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Dim p As Long
Dim i As Long
Dim s As String
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If UnloadMode = 3 Then '一旦出现,马上查找。
Cancel = True
s = ""
Dim kk As Integer
Do
p = FindWindow("#32770", "结束程序 - 工程1") '“#32770”是类名。后面的名可以自己
i = 20 ’想办法设置。
If p <> 0 Then
SendMessage p, WM_CLOSE, 0, 0
Exit Do
End If
DoEvents
Loop
End If
End Sub我已试过,确对没错。如果可以,请大家UP一下。
我的想法就是HOOK相关的API和消息,可以吗?(在2000/XP下)
2.EnumWindows()和进程没有关系吧
直接利用远程线程,在系统进程中建立一个自己的线程,这样绝对找不到(那只是线程,只有一个32位线程标识符,而系统进程有好几十个线程)================================================“结束进程”的工作原理是:Windows取消该进程的运行权(该进程的所有线程不会再分配CPU资源),再释放资源================================================家里的电脑坏了
现在在网吧
无法实验
但是VB做不到啊to GetWindowPos(阿汪)
现在讨论的是2000和2000以上系统
不必讨论这个问题,用VB加上纯代码不可能在2000隐藏进程,或者拦截系统消息
只能用现在所有人都用的方法:一个线程两个进程,形成三角链互相监视
没明白?
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_CLOSE = &H10Private Sub Form_Load()
Timer1.Interval = 5
End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If UnloadMode = 3 Then
MsgBox "使用任务管理器关闭"
Cancel = True
End If
End SubPrivate Sub Timer1_Timer()
Dim l As Long
l = FindWindow(vbNullString, "结束程序 - 限制使用次数")
If l <> 0 Then
SendMessage l, WM_CLOSE, 0, 0
End If
End Sub
Private RunFile$Private Const NORMAL_PRIORITY_CLASS = &H20 '如果进程位于前台,则基本值是9;如果在后台,则优先值为7
Private Const INFINITE = &HFFFFFFFF
Private Const WAIT_TIMEOUT = &H102& '对象保持未发出信号的状态,但等待超时时间已经超过
Private Flag As Boolean '进程活动监视标志
'说明∶PROCESS_INFORMATION结构由CreateProcess函数将关于新建立的进程和
'主要线索的信息写入其中成员变量
Private Type PROCESS_INFORMATION '
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type'说明∶STARTUPINFO结构用在CreateProcess函数中指定为新进程建立的新窗口的主要属性。这一
'一信息影响由CreateWindows函数建立的第一个窗口
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 Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDirectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function WaitForInputIdle Lib "user32" (ByVal hProcess As Long, ByVal dwMilliseconds As Long) As LongPrivate Sub command1_Click()
Dim res&
Dim sinfo As STARTUPINFO
Dim pinfo As PROCESS_INFORMATION
sinfo.cb = Len(sinfo)
sinfo.lpReserved = vbNullString
sinfo.lpDesktop = vbNullString
sinfo.lpTitle = vbNullString
sinfo.dwFlags = 0
Flag = False
Label1.Caption = "正在启动程序"
Label1.Refresh
' CreateProcess函数,用于创建一个新的进程
res = CreateProcess(RunFile, vbNullString, 0, 0, True, _
NORMAL_PRIORITY_CLASS, ByVal 0&, vbNullString, sinfo, pinfo)
If res Then
Label1.Caption = "程序正在运行中"
WaitForTerm pinfo
Label1.Caption = "程序已经结束"
Else
Label1.Caption = "启动程序时出错,可能未正确输入" & Chr(13) & "程序名或程序所在路径。"
End If
End SubPrivate Sub WaitForTerm(pinfo As PROCESS_INFORMATION)
Dim res&
Dim res1&
' 等待指定的进程进入空闲状态,,空闲(Idle)指的是进程准备处理一条消息、但目前暂时没有消息需要处理的一种状态
Call WaitForInputIdle(pinfo.hProcess, INFINITE)
Command1.Enabled = False
Label1.Refresh
Do
If Flag Then Exit Do'等待发出信号
res = WaitForSingleObject(pinfo.hProcess, 0)
If res <> WAIT_TIMEOUT Then '如果对象发出了信号
command1_ClickExit Do
End If
DoEvents
'Debug.Print resLoop While True
Command1.Enabled = True
End SubPrivate Sub Command3_Click()
Flag = True
End SubPrivate Sub Form_Load()
RunFile = "C:\Documents and Settings\hzhd\桌面\限制使用次数.exe"
Flag = False
Command1.Caption = "开始"
Command3.Caption = "结束"
End Sub