See IShellExecuteHook in MSDN
IShellExecuteHook::Execute
Called when ShellExecute or ShellExecuteEx is called for an object that is registered. 
HRESULT Execute(
    LPSHELLEXECUTEINFO pei
);
refer to http://www.codeguru.com/shell/ShellLogging.html

解决方案 »

  1.   

    钩子,又见钩子……
    其实做个标准的exe就可以了嘛,开一个线程,定时检查系统当前运行模块的列表,发现指定进程运行后,将其杀死不就得了
      

  2.   

    那么如何检查当前的模块列表呢,能否说得详细点?最好告诉我用哪些api,谢了!
      

  3.   

    EnumProcesses(获得进程的数目)、OpenProcess(获得进程的句柄)
    EnumProcessModules(获得进程模块的句柄)、GetModuleBaseName(获得进程模块的全路经名字)
    compare...TerminateProcess(杀死进程)大概就是这些吧,有些不是很清楚了
      

  4.   

    多谢waiwaiwai的帮忙!我参考你列出的函数,写了一个小程序,但是编译老出错,要用这些函数是否要包含某一头文件?我在程序中只含入了windows.h,请大家帮我看看错在什么地方:.
    .
    .
     case WM_TIMER:
      EnumProcesses(ProcessIDs,sizeof(ProcessIDs)*4,cbProcessNeeded);
      for(i=0;i<cbProcessNeeded/sizeof(DWORD);i++)
      {
      hProcess=OpenProcess(PROCESS_ALL_ACCESS,TRUE,ProcessIDs[i]);
      EnumProcessModules(hProcess,hModule,sizeof(hModule)*sizeof(HMODULE),
                     &cbModuleNeeded);
      for(i=0;i<cbModuleNeeded/sizeof(HMODULE);i++)
      {
      GetModuleBaseName(hProcess,hModule[i],buffer,sizeof(buffer));
      //如果满足我的判断条件,则结束进程
      //IsMatched是我自己写的一个函数
      if(IsMatched(buffer,szTargName))
      {
      GetExitCodeProcess(hProcess,&ExitCode);
      TerminateProgress(hProcess,ExitCode);
      MessageBox(NULL,TEXT("exit"),NULL,MB_OK);
      SendMessage(hwnd,WM_DESTROY,0,0);
      }
      }
      }          return 0; 
    .
    .
    .
    (对不起,这个编辑框太糟糕了,我一贴过来格式就乱了,请大家见谅!)
    出错信息如下:
    H:\My Projects\VC\winampe\winampe.cpp(82) : error C2065: 'EnumProcesses' : undeclared identifier
    H:\My Projects\VC\winampe\winampe.cpp(83) : warning C4018: '<' : signed/unsigned mismatch
    H:\My Projects\VC\winampe\winampe.cpp(86) : error C2065: 'EnumProcessModules' : undeclared identifier
    H:\My Projects\VC\winampe\winampe.cpp(88) : warning C4018: '<' : signed/unsigned mismatch
    H:\My Projects\VC\winampe\winampe.cpp(90) : error C2065: 'GetModuleBaseName' : undeclared identifier
    H:\My Projects\VC\winampe\winampe.cpp(96) : error C2065: 'TerminateProgress' : undeclared identifier除了函数名出错外,其中的'<'(就是我的for循环那两行)错误我也不能理解,
    请大家帮帮我!
      

  5.   

    sizeof 宏返回的本来就是结构的字节数,不必再乘以4了
    指定的函数名无效是因为上面的函数来自于需要你手动加载的一个动态库psapi.dll中,你可以使用loadlibrary来获得函数的地址,或者干脆引入psapi的头文件以及相应的库文件以达到直接引用函数的目的
    另外在枚举进程模块的时候,只考虑进程中的第一个就可以了,具体原因请详见msdn,也就是说第二个for循环是多余的
            CString sName;
            HMODULE hMod;
            DWORD cbNeeded;
            
            if( EnumProcessModules( hProcess, &hMod, sizeof( hMod ), &cbNeeded ) )
            {
    DWORD dw = GetModuleBaseName( hProcess, hMod, sName.GetBuffer( MAX_PATH ), MAX_PATH );
    sName.ReleaseBuffer();
            }
    那个警告你不必在意,只不过是ms故意造成的一个bug罢了,这样的事情司空见惯
      

  6.   

    如果要枚举进程请参看:HOWTO: Enumerate Applications in Win32
    Last reviewed: January 6, 1998
    Article ID: Q175030上面的办法虽然是对的,但是只能在2000和NT下用。。9X系统不存在PSAPI的。只有Toolapi的我个人觉得应该用楼顶兄弟的方法~~~定时对进程进行检查是不能达到你要做的目的的。。
    如果你不会的话,可以去VCKBASE找一下kblauch的例子。稍稍改变一下,你就会发现很简单的。呵呵。但要注意,你要控制一些权限问题,这个钩子是可以改注册表或用Regsv32反注册去掉的你可以将DllunRegisterServer改写一下,用别的名字来进行实际的反注册工作。至于注册表。可以对用户执行权限做一点改变
      

  7.   


      Header: Declared in Psapi.h.
      Library: Use Psapi.lib.
      

  8.   

    郁闷!!
    加了一句include <psapi.h>后,编译是基本通过了,连接时还是不行啊!我看了一下,winnt\system32下确实有这个文件:psapi.dll,不知道为什么?
    Linking...
    winampe.obj : error LNK2001: unresolved external symbol _GetModuleBaseNameA@16
    winampe.obj : error LNK2001: unresolved external symbol _EnumProcessModules@16
    winampe.obj : error LNK2001: unresolved external symbol _EnumProcesses@12
    Debug/winampe.exe : fatal error LNK1120: 3 unresolved externals
    Error executing link.exe.
      

  9.   

    project->settings->link->module librarys:
    加入psapi.lib
      

  10.   

    网络真是个好东西啊!
    感谢这么多高手来看一个菜鸟写的垃圾代码!问题基本上算解决了。
    特别要感谢的是waiwaiwai(我总不明白) 等网友的热心帮助。
    分数我已经加了,请各位查收:)
      

  11.   

    大家收到分没有??我在结贴时把一百分都加了,有一个对话框问我要不要加入FAQ,我回答是。
    为什么我现在看帖子上分数都为零???
    可是我点管理就看到分数都加了。