找回密码
 加入
搜索
查看: 3726|回复: 9

[GUI管理] [已解决]请问如何做到 除了当前程序窗口,关闭目前所有窗口?

 火.. [复制链接]
发表于 2010-7-8 22:34:18 | 显示全部楼层 |阅读模式
本帖最后由 elexy 于 2010-7-9 11:51 编辑

指定的窗口用winclose就能搞定,现在想在程序运行前,将当前系统里的其他窗口全部关掉,不知道这段代码如何写才能高效解决。



______________________________________________________
谢谢 3mile,不好意思,可能是我描述不清楚,您的这段代码太猛了,运行后,连WINDOWS的关机重启的菜单都弹出来了,效果就像是关闭了 explorer.exe  一样,屏幕整个闪了一下,右下角的音量、网络等图标都重新加载了一遍。   有没有温柔一点的?其实只需要将 任务管理器 应用程序 列表里的任务 winkill 掉即可。您那样太吓人了
 楼主| 发表于 2010-7-9 07:44:52 | 显示全部楼层
顶上去求解...
发表于 2010-7-9 08:10:59 | 显示全部楼层
帮顶,,等待高手回答。。
发表于 2010-7-9 09:14:28 | 显示全部楼层
我来帮忙顶
发表于 2010-7-9 09:25:02 | 显示全部楼层
$var = WinList()

For $i = 1 to $var[0][0]
  ; 只显示带有标题的可见窗口
  If $var[$i][0] <> "" AND IsVisible($var[$i][1]) Then
    $state=WinGetState($var[$i][0])
        If $state<>47 Then WinKill($var[$i][0])
  EndIf
Next

Func IsVisible($handle)
  If BitAnd( WinGetState($handle), 2 ) Then 
    Return 1
  Else
    Return 0
  EndIf

EndFunc

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

发表于 2010-7-9 09:33:48 | 显示全部楼层
WinKill 也可以考虑先使用 WinClose ,以提示用户关闭前保存数据
 楼主| 发表于 2010-7-9 10:44:50 | 显示全部楼层
谢谢 3mile,不好意思,可能是我描述不清楚,您的这段代码太猛了,运行后,连WINDOWS的关机重启的菜单都弹出来了,效果就像是关闭了 explorer.exe  一样,屏幕整个闪了一下,右下角的音量、网络等图标都重新加载了一遍。   有没有温柔一点的?其实只需要将 任务管理器 应用程序 列表里的任务 winkill 掉即可。您那样太吓人了
发表于 2010-7-9 11:22:34 | 显示全部楼层
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Form1", 587, 395, 192, 114)
$ListView1 = GUICtrlCreateListView("窗口状态|窗口标题", 48, 32, 497, 329,$LVS_NOLABELWRAP)
GUISetState(@SW_SHOW)
win()

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit

        EndSwitch
WEnd


Func win()
$var = WinList()
For $i = 1 to $var[0][0]
  ; 仅显示带标题的可见窗口
  If $var[$i][0] <> "" AND IsVisible($var[$i][1]) Then
        if $var[$i][1] = $Form1 or $var[$i][0] = "Program Manager" then
        GuiCtrlCreateListViewItem("未关闭" & "|" & $var[$i][0],$ListView1)
        else
        WinKill($var[$i][1])
        GuiCtrlCreateListViewItem("已关闭" & "|" & $var[$i][0],$ListView1)
        endif
  EndIf
Next
EndFunc

Func IsVisible($handle)
  If BitAnd( WinGetState($handle), 2 ) Then 
    Return 1
  Else
    Return 0
  EndIf
EndFunc

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

发表于 2010-7-9 11:43:15 | 显示全部楼层
本帖最后由 jhun 于 2010-7-9 11:53 编辑
$WinList = WinList()
For $i = 1 to $WinList[0][0]
  If $WinList[$i][0] <> "" AND IsVisible($WinList[$i][1]) Then
    If $WinList[$i][0]<>"Program Manager" Then WinClose ($WinList[$i][0])
  EndIf
Next

Func IsVisible($handle)
  If BitAnd( WinGetState($handle), 2 )  And WinGetText ($handle) And WinActive ($handle)=0 Then 
    Return 1
  Else
    Return 0
  EndIf

EndFunc

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

 楼主| 发表于 2010-7-9 11:50:23 | 显示全部楼层
感谢 xsjtxy 、jhun   
8楼的带GUI
9楼的精简高效
都能满足需求。
发表于 2010-7-9 11:54:27 | 显示全部楼层
本帖最后由 jhun 于 2010-7-9 11:59 编辑

开始忘了需要保留当前的窗口这个要求了,重新修改过了,另外就是没有文本的窗口会忽略
发表于 2010-7-9 12:04:18 | 显示全部楼层
未加思索测试你们的代码,把我几个ie下载框给干掉了,速度老慢,下了半天的,损失惨重…… 还有一些打开的文件夹也没了……
下次测试前还是先看看代码的好~

LZ的问题我想还是先列表显示所有非系统进程的*.exe进程名,再进行有选择的关闭,这样会更人性化一点。
发表于 2010-7-9 12:46:40 | 显示全部楼层
未加思索测试你们的代码,把我几个ie下载框给干掉了,速度老慢,下了半天的,损失惨重…… 还有一些打开的文 ...
afan 发表于 2010-7-9 12:04



    好吧,我错了,为了赎罪,我做了这个
http://www.autoitx.com/forum.php ... id=16788&extra=

评分

参与人数 1金钱 +15 收起 理由
afan + 15

查看全部评分

发表于 2010-7-9 12:46:46 | 显示全部楼层
回复 12# afan

是啊,用这个函数,应先建立一个排除关闭的进程列表,要不然,什么进程统统kill一次,很容易出问题。

评分

参与人数 1金钱 +15 收起 理由
afan + 15

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-6-11 23:00 , Processed in 0.118922 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表