Process 自动热键终止挂起过程
我发现了一种找到挂起进程的方法,但无论使用何种方法,我似乎都无法杀死它:Process 自动热键终止挂起过程,process,kill,autohotkey,hung,Process,Kill,Autohotkey,Hung,我发现了一种找到挂起进程的方法,但无论使用何种方法,我似乎都无法杀死它: #Persistent Menu, Tray, Icon, User32.dll, 2 SMTO_NOTIMEOUTIFNOTHUNG := 8 Delay = 200 SetTimer, CheckAllWindows, 10 Return CheckAllWindows: SetTimer, Che
#Persistent
Menu, Tray, Icon, User32.dll, 2
SMTO_NOTIMEOUTIFNOTHUNG := 8
Delay = 200
SetTimer, CheckAllWindows, 10
Return
CheckAllWindows:
SetTimer, CheckAllWindows, Off
WinGet, hWnd, List
Loop, %hWnd% {
ID := hwnd%A_Index%
DllCall("SendMessageTimeout", UInt,ID, UInt, 0, Int,0, Int,0
, UInt, SMTO_NOTIMEOUTIFNOTHUNG, Int,3, "UInt *", Result )
WinGetTitle, Title, ahk_id %ID%
PID := DllCall("GetCurrentProcessId")
IfNotEqual,Result,0,GoSub,Alert
Sleep %Delay%
}
SetTimer, CheckAllWindows, %Delay%
Return
Alert: ; This routine can be used to repeat testing & offer a WinKill.
Process, Close, PID
Sleep 50000
Run, "C:\Program Files\sample_file.exe"
Return
现在,程序发现进程已挂起并将运行该文件,但它不会关闭。我也试过输——运气不好。想法?Feren6,我希望我没有压倒你,但我曾经剪辑过这篇文章,但我还没有使用过它,我希望它能帮助你,特别是帮助你完成任务 wParam的记录值为:
1. HSHELL_WINDOWCREATED
2. HSHELL_WINDOWDESTROYED
3. HSHELL_ACTIVATESHELLWINDOW
4. HSHELL_WINDOWACTIVATED
5. HSHELL_GETMINRECT
6. HSHELL_REDRAW
7. HSHELL_TASKMAN
8. HSHELL_LANGUAGE
9. HSHELL_SYSMENU
10. HSHELL_ENDTASK
11. HSHELL_ACCESSIBILITYSTATE
12. HSHELL_APPCOMMAND
13. HSHELL_WINDOWREPLACED
14. HSHELL_WINDOWREPLACING
15. HSHELL_HIGHBIT
16. HSHELL_FLASH
17. HSHELL_RUDEAPPACTIVATED
lParam的类型根据接收到的wParam的值而不同。对于大多数wParam值,lParam是窗口的句柄,可以在ahk的窗口命令中用作ahk_id%lParam%
一些想法:
每当窗口最小化/最大化时,shell_GETMINRECT(具有shellhook结构)将接收到shell_GETMINRECT。脚本可以对其进行监视,以最小化托盘的窗口。
重新绘制窗口时,shell将接收HSHELL_重新绘制。脚本可以监视它,以便在其内容发生更改时激活窗口
我尝试过实验,以下是一些例子:
实验1:
在Windows XP中,CTRL+ALT+DEL将带来任务管理器。论坛上出现了一些帖子,要求以某种方式拒绝访问TaskManager。
创建Windows任务管理器时,以下脚本几乎立即检测并关闭Windows任务管理器
代码:
持久的
设置行,-1
进程,优先级,高
Gui+LastFound
hWnd:=WinExist()
DllCall(“RegisterSharelHookWindow”,UInt,hWnd)
MsgNum:=DllCall(“RegisterWindowMessage”,Str,“SHELLHOOK”)
OnMessage(MsgNum,“ShellMessage”)
返回
ShellMessage(wParam、LPRAM){
如果(wParam=1);HSHELL\u WINDOWCREATED:=1
{
Wingtittle,标题,ahk_id%lParam%
如果(Title=“Windows任务管理器”)
{
WinClose,ahk_id%lParam%
;运行,Calc.exe;而不是
}
}
}
实验2:
钩住外壳消息提供了一种可靠的方法来跟踪最后一个活动窗口。
请参阅:如何检索上一个活动窗口?由r0lZ
下面的脚本切换活动窗口的最顶层/顶层样式(始终在顶部打开/关闭)
代码:
持久的
菜单、托盘、非标准
菜单、托盘、添加、切换AOT、切换GLEAOT
菜单、托盘、添加、,
菜单、托盘、添加、重新加载、ExitScript
菜单、托盘、添加、退出、退出脚本
菜单、托盘、提示、切换AOT
菜单、任务栏、默认、切换AOT
Gui+LastFound
DllCall(“RegisterSharelHookWindow”,UInt,WinExist())
MsgNum:=DllCall(“RegisterWindowMessage”,Str,“SHELLHOOK”)
OnMessage(MsgNum,“ShellMessage”)
LastActiveWindowID:=WinActive(“A”)
返回;//自动执行部分结束//
ShellMessage(wParam、LPRAM){
全局LastActiveWindowID
如果(wParam=4和WinExist(“ahk_id”lParam)){;HSHELL_WINDOWACTIVATED=4
LastActiveWindowID:=LPRAM
}
}
托格里奥特:
WinSet,AlwaysOnTop,切换,ahk_id%LastActiveWindowID%
返回
出口说明:
DllCall(“注销ShellHookWindow”,UInt,hWnd);我想是多余的!
如果相等,A_ThisMenuItem,重新加载,重新加载
出口
返回
运行脚本。
单击目标窗口以使其聚焦。
双击脚本托盘图标。
目标窗口将在最顶层和顶层样式之间切换
实验3:
我有一个Logitech多媒体键盘,但没有安装随附的软件。我使用的是我自己的OSD脚本,它使用音量上升/DN/MUTE键作为热键,通过SoundGet/SoundSet命令触发调整
现在我发现,每当我按下mulitmedia键时,Shell就会收到通知(HSHELL_APPCOMMAND)。LPRAM的HiWord包含按下的MM键的值。因此,我修改了我的音量更改OSD脚本,使其在没有热键或声音集命令的情况下工作
代码:
图形用户界面,颜色,FFFFFF
Gui,-标题+边框+AlwaysOnTop+工具窗口+LastFound
hWnd:=WinExist(),DllCall(“RegisterSharelHookWindow”,UInt,hWnd)
MsgNum:=DllCall(“RegisterWindowMessage”,Str,“SHELLHOOK”)
OnMessage(MsgNum,“ShellMessage”)
Gui,添加,图片,x5 y5 w32 h32 Icon4 vIcon1,SndVol32.exe
Gui,添加,图片,x5 y5 w32 h32 Icon5 vIcon2,SndVol32.exe
环路,25
图形用户界面,添加,文本,x+3 w5 h32隐藏边框vText%A_索引%0x4
返回;//自动Exexute段结束//
ShellMessage(wParam、LPRAM){
如果(wParam=12和((lParam>>16)>=8或(lParam>>16)>16)
返回
GuiClose:
图形用户界面,显示,隐藏
返回
GuiShow:
桂,秀,,
返回
它不是详尽的,但是理解这些东西是如何工作的很有用
运行上述代码后,运行计算器并将其从标准模式更改为科学模式。
你会发现计算器窗口被破坏并再次创建,导致句柄的改变。(我不知道)
有趣的是,我发现每当窗口闪烁其标题栏/任务栏按钮时,Shell就会收到一个未记录(AFAIK)值0x8006(32774)。下面的代码会激活一个闪烁的窗口:(不确定它是否适用于所有人):
代码:
Gui+LastFound
hWnd:=WinExist(),DllCall(“RegisterSharelHookWindow”,UInt,hWnd)
MsgNum:=DllCall(“RegisterWindowMessage”,Str,“SHELLHOOK”)
OnMessage(MsgNum,“ShellMessage”)
Return;//自动执行节结束//
ShellMessage(wParam、LPRAM){
如果(wParam=0x8006);0x8006是32774,如Spy!
{
WinActivate,ahk_id%lParam%
}
}Feren6,我希望我没有压倒你,但我曾经剪辑过这篇文章,但我还没有使用过它,我希望它能帮助你,特别是帮助你完成任务 wParam的记录值为:
1. HSHELL_WINDOWCREATED
2. HSHELL_WINDOWDESTROYED
3. HSHELL_ACTIVATESHELLWINDOW
4. HSHELL_WINDOWACTIVATED
5. HSHELL_GETMINRECT
6. HSHELL_REDRAW
7. HSHELL_TASKMAN
8. HSHELL_LANGUAGE
9. HSHELL_SYSMENU
10. HSHELL_ENDTASK
11. HSHELL_ACCESSIBILITYSTATE
12. HSHELL_APPCOMMAND
13. HSHELL_WINDOWREPLACED
14. HSHELL_WINDOWREPLACING
15. HSHELL_HIGHBIT
16. HSHELL_FLASH
17. HSHELL_RUDEAPPACTIVATED
根据接收到的wParam值,LPRAM的类型有所不同。对于大多数wParam值,LPRAM是可以用作ahk的窗口句柄
* APPCOMMAND_BROWSER_BACKWARD = 1