效果
最近寫代碼經常和各種進程打交道,發現了一個很有意思的黑科技。
我直接說有什么用吧,可以設置每隔多少時間檢查某個程序是否在使用,如果在用,就強制關閉。比如,有的sb舍友晚上就是不睡覺,一邊打游戲一邊嚷嚷,那么把程序放他電腦里,定時五分鍾,他會發現他的擼啊擼每次都是只能玩五分鍾就強退。
之前說的用robot廢掉鍵盤和鼠標太小兒科,配合這個使用,保證讓舍友懷疑人生。
最重要的是,用vb和bat代碼量賊少而且非常方便,還能設置開機自動執行!
這里設置了檢查記事本文件,時間間隔為五秒,效果就是運行程序后,記事本文件閃退,一直打不開
源碼
不難,就是使用Java執行Windows命令而已,我們實現的過程其實就是在模擬在cmd小黑窗口里輸入命令。
public static void main(String[] args) throws AWTException {
shutdownPro("QQ", 5000);//傳入兩個參數,一個是想要操作的進程的名字,一個是時間間隔
}
public static void shutdownPro(String progressName,int time) throws AWTException {
int isRunning = -1;//定義變量,該變量用來判斷某程序是否在運行,初始值為-1
Robot robot=new Robot();
while(true) {
try {
robot.delay(time);//使用robot的延時功能來完成每隔多少時間運行一次,當然還有其他方法實現該功能
//下面兩句是用Java來調用某個程序的語句,這里定義了一個Windows的命令,然后去執行。該語句的作用是查看當前在運行的程序
String cmd = " tasklist";
Process p = Runtime.getRuntime().exec(cmd);
//上述語句執行完后,可以通過Process對象獲得窗口返回的數據,把這個數據拼接成一個字符串
StringBuffer proList = new StringBuffer();
byte[] b = new byte[1024];
for (int n; (n = p.getInputStream().read(b)) != -1;) {
proList.append(new String(b, 0, n));
}
isRunning = proList.toString().indexOf(progressName+".exe");//調用indexOf方法判斷某個進程是否存在於我們得到的結果中
//如果有,說明在運行
if (isRunning >= 0) {
System.out.println("正在關閉");
//同上,執行一條命令,該命令是強制關閉該進程
String command = "taskkill /f /im "+progressName+".exe";
Runtime.getRuntime().exec(command);
System.out.println("已關閉");
} else {
System.out.println("無進程");
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
講解
-
cmd命令:其實就是Windows命令,感興趣的自己去查一下。
這里我們用到了兩個,一個是tasklist,該命令是列出當前在運行的程序,就是打開任務管理器,看到的當前進程列表
在cmd里運行的效果是
第二條命令:taskkill /f /im xxx.exe
taskkill是Windows命令行里終止指定程序進程的命令。
/f 表示強制終止
/im 表示指定的進程名稱
xxx,就寫程序名字唄,相關記事本就是notepad,想關QQ那就是QQ唄,當然最重要的是關了他們的LOL -
設置多久執行一次
顯然死循環啊,里面用Robot的延時方法或者線程sleep方法都行。
不嫌麻煩用時間日期類來做也行 -
如何判斷某程序是否在運行
執行第一條指令,會得到返回結果,我們把它當成一個字符串來看,這個字符串里包含了所有當前在運行的程序。那用string的indexof方法或者contains方法都行啊,判斷這個字符串是否包含某個子字符串,這個子字符串就是我們指定的程序名
如果存在,那么執行第二條指令,強行關閉
擴展
上面是學習一下Java,下面才是干貨
do
set bag=getobject("winmgmts:\\.\root\cimv2")
set pipe=bag.execquery("select * from win32_process where name='notepad.exe'")
for each i in pipe
i.terminate()
next
wscript.sleep 5000
loop
vb版本,和系統打交道還是vb和bat腳本比較方便,不同語言的作用不一樣,這個要區分清楚。
復制上面代碼到記事本里,保存,后綴改成.vbs就行了,雙擊直接能運行。
記得把進程名和時間改成自己需要的就行。然后就可以拿舍友測試了。
什么?你還想設置為開機自動啟動?
不行,這太狠了,人家只是打個游戲而已,不至於趕盡殺絕吧。
你打死我,我也不會告訴你,把這個vb程序放到C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp路徑下就可以開機自動啟動了,我也不會告訴你如果你設置是他系統進程或者直接執行關機命令,再把時間調成一秒,他的電腦開機屏幕一亮就關機了!打死我也不說
問:為什么不寫注釋也不仔細講解?
答:我也不會啊,我copy的
這個東西網上一搜有現成的,很簡單。vb比較簡單,做一些小工具還可以,感興趣的可以自己研究
矯情一下
我主業是做研發的,最近因為工作關系,接觸到了很多學生,發現很多同學對學編程很頭疼。我上學的時候也有這種困惑。
我始終認為,編程是一件很有意思的事情,代碼可以做出很多意想不到的東西來,程序員不僅可以改變世界,也可以陶冶情操。同時,我也想顛覆外行人對程序員的認知,搞代碼的不是你們認為的格子衫牛仔褲帆布鞋,也不是禿頭,鋼鐵直男,做程序只是工作,和人沒關系。
可用的代碼千篇一律,有趣的設計萬里挑一。希望我的一些綿薄之力可以讓更多人愛上編程。
當然,肯定還是要靠自己學嘛,至於為什么,emmmm……老師們上課對着PPT念一學期能教出啥來,他們最擅長把的是把你學習的興趣磨沒有。