小弟我最近想写一个小程序,用来禁止我电脑上边的魔兽争霸运行。本来想用系统钩子,但是写的很困难,
所以就改用监视进程的办法,获得快照后逐个对比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;
}

解决方案 »

  1.   

    换种方法试试,用Spy++查出War3.exe的窗口类名,程序中用FindWindow给出类名查找窗口,找到之后向其发送WM_CLOSE消息。
      

  2.   

    发现你上面程序中一处错误:(*pe32.szExeFile==*p)这样是比较两个指针是否相等,结果肯定是不等的,应该用stricmp函数来比较。
      

  3.   

    嗯,比较字符串确实得用stricmp,我的错误。
    不过我还得问下沙发,具体怎么实现,能把代码贴出来么?
    还有,有没有占系统资源少的方法呢??谢谢
      

  4.   

    代码很少,就是FindWindow然后SendMessage。只要检测频率低一些,占用系统资源可以忽略不计。另外也可以用SetWindowsHookEx的方法,不过这种方法比较复杂,而且要向每个进程插入DLL,效果可能还不如自己检测的好。
      

  5.   

    禁止/恢复运行
    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("设置完成!");
    }
      

  6.   

    while(TRUE)
        {
            scan();
        }
    中好歹也加个Sleep(1000);休息下
      

  7.   

    直接注册NtDDK里的PsSetCreateProcessNotifyRoutineEx在回调函数里很容易判断
      

  8.   

    试了一下6楼的,发现改名对有版本信息的exe无效,很好的解法啊
      

  9.   

    嗯,修改注册表确实是不错的办法,一劳永逸谢了,
    不过很容易被被人发现,(他WAR3打不开,第一反应就是去看注册表。。)目的就达不到了,呵呵。
    我把我发的东西改了下,把进程名字伪装成explore.exe,呵呵,但是就算增加了Sleep(),也太占CPU了。。也比较明显
    我觉得8楼的大哥说的不错,就是不知道对系统处理的速度影响大不大,我再试试。
    再次谢谢大家关心
      

  10.   

    挂个WH_CBT钩子然后在HCBT_CREATEWINDOW里替换SARS的窗口过程,实现终止,似乎麻烦了点啊其实我看在HCBT_ACTIVE里直接蹦了这个进程就满好的.