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