小弟我最近想写一个小程序,用来禁止我电脑上边的魔兽争霸运行。本来想用系统钩子,但是写的很困难,
所以就改用监视进程的办法,获得快照后逐个对比szExeFile,然后结束进程。这种办法非常笨且占CPU。
但我也不会别的,不过貌似这样也不能结束War3.exe的进程,不知道为什么,请高手指点下。如果有更高明的办法,
比如用钩子来实现,麻烦把源码发上来,谢谢。#include "stdafx.h"
#include <windows.h>
#include <string.h>
#include <tlhelp32.h>
#pragma comment(linker, "/subsystem:\"Windows\" /entry:\"mainCRTStartup\"")
void KillProcess(DWORD Pid)
{
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,Pid);
int a=TerminateProcess(hProcess,0);
}void scan()
{
char *p="War3.exe"; PROCESSENTRY32 pe32;
pe32.dwSize=sizeof(pe32);
HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); BOOL bProcess=Process32First(hProcessSnap,&pe32);
while(bProcess)
{
if(*pe32.szExeFile==*p){KillProcess(pe32.th32ProcessID);break;}
bProcess=Process32Next(hProcessSnap,&pe32);
}
CloseHandle(hProcessSnap);
}int main()
{
while(TRUE)
{
scan();
}
return 0;
}
所以就改用监视进程的办法,获得快照后逐个对比szExeFile,然后结束进程。这种办法非常笨且占CPU。
但我也不会别的,不过貌似这样也不能结束War3.exe的进程,不知道为什么,请高手指点下。如果有更高明的办法,
比如用钩子来实现,麻烦把源码发上来,谢谢。#include "stdafx.h"
#include <windows.h>
#include <string.h>
#include <tlhelp32.h>
#pragma comment(linker, "/subsystem:\"Windows\" /entry:\"mainCRTStartup\"")
void KillProcess(DWORD Pid)
{
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,Pid);
int a=TerminateProcess(hProcess,0);
}void scan()
{
char *p="War3.exe"; PROCESSENTRY32 pe32;
pe32.dwSize=sizeof(pe32);
HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); BOOL bProcess=Process32First(hProcessSnap,&pe32);
while(bProcess)
{
if(*pe32.szExeFile==*p){KillProcess(pe32.th32ProcessID);break;}
bProcess=Process32Next(hProcessSnap,&pe32);
}
CloseHandle(hProcessSnap);
}int main()
{
while(TRUE)
{
scan();
}
return 0;
}
解决方案 »
- 问下关于ATL和COM的书籍!~
- 经典问题。超级罕见。提供个对树形控件添加,删除,改名操作的例子,顺带问个问题:
- 如何动态改变CListBox的窗口大小?
- 那里可以下载Directshow SDK?
- 大家来看看!
- 送分怎么没有人要呀。
- 如何在内存中将bmp转换为jpg or gif???
- ATL中如何封装打印机?或相关内容,50奉献热心帮助之士!~
- 请问:在proxy/stub(ATL)中,使用nmake 编连 *.mk文件中,总是不成功
- 如何使自己制做的帮助文件打开后先是一本本合上的小红书,点击后才一页页打开?
- 我用TCP连续调用send发送数据,可客户端会出现丟包现象,如何解决?
- 在 VC 6.0 里怎么打开二进制文件(*.BIN),而且进行播放、暂停、退后、停止
不过我还得问下沙发,具体怎么实现,能把代码贴出来么?
还有,有没有占系统资源少的方法呢??谢谢
char szFilters[]=
"exe Files (*.exe)|*.exe|All Files (*.*)|*.*||"; CFileDialog fileDlg (TRUE, "exe", "*.exe",
OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters, this); fileDlg.m_ofn.lStructSize = 88;
if( fileDlg.DoModal ()==IDOK )
{
SetAppRun(fileDlg.GetFileName());
}
void SetAppRun(LPCTSTR lpAppName, BOOL bRun)
{
HKEY hKey;
LONG lRet;
DWORD dw1; CString strSubKey;
strSubKey.Format("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\%s",
lpAppName); if(!bRun)
{ lRet = RegCreateKeyEx(HKEY_LOCAL_MACHINE,strSubKey,0,NULL,0,KEY_ALL_ACCESS,NULL,&hKey,&dw1); LPCTSTR lpNoRun = "DisabledRun";
RegSetValueEx(hKey,"Debugger",0,REG_SZ,(CONST BYTE *)lpNoRun,strlen(lpNoRun)+1); RegCloseKey(hKey);
}
else
{
RegDeleteKey(HKEY_LOCAL_MACHINE,strSubKey);
} MessageBox("设置完成!");
}
{
scan();
}
中好歹也加个Sleep(1000);休息下
不过很容易被被人发现,(他WAR3打不开,第一反应就是去看注册表。。)目的就达不到了,呵呵。
我把我发的东西改了下,把进程名字伪装成explore.exe,呵呵,但是就算增加了Sleep(),也太占CPU了。。也比较明显
我觉得8楼的大哥说的不错,就是不知道对系统处理的速度影响大不大,我再试试。
再次谢谢大家关心