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
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
解决方案 »
- 窗口使用定时器,每隔一秒,交替用三种颜色填充整个窗口客户区
- 在 VS2010 中 用PlaySound 播放音乐的问题,求大神指导 ,为什么不能换音乐?
- 无效的字符值或规格(NULL)
- 如果线程空闲应该怎么处理?
- 怎样使编辑框里的字变成红色?还有能不能使编辑框里选中的能不能不是连接的?
- 大家觉得这样的软件开价多少合适呢,都来评评,来者给分!!
- EnumThreadWindos\EnumThreadWndProc如何使用?
- Serialize文件保存函数里面系统隐含了什么代码?
- 如何改变静态文字的背景色?
- 怎么通过mfc读取mysql数据库中的表格生成xml文件
- 登记表
- ADO Connection触发异常时,出现内存访问错误,正常情况下一切正常返回!
其实做个标准的exe就可以了嘛,开一个线程,定时检查系统当前运行模块的列表,发现指定进程运行后,将其杀死不就得了
EnumProcessModules(获得进程模块的句柄)、GetModuleBaseName(获得进程模块的全路经名字)
compare...TerminateProcess(杀死进程)大概就是这些吧,有些不是很清楚了
.
.
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循环那两行)错误我也不能理解,
请大家帮帮我!
指定的函数名无效是因为上面的函数来自于需要你手动加载的一个动态库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罢了,这样的事情司空见惯
Last reviewed: January 6, 1998
Article ID: Q175030上面的办法虽然是对的,但是只能在2000和NT下用。。9X系统不存在PSAPI的。只有Toolapi的我个人觉得应该用楼顶兄弟的方法~~~定时对进程进行检查是不能达到你要做的目的的。。
如果你不会的话,可以去VCKBASE找一下kblauch的例子。稍稍改变一下,你就会发现很简单的。呵呵。但要注意,你要控制一些权限问题,这个钩子是可以改注册表或用Regsv32反注册去掉的你可以将DllunRegisterServer改写一下,用别的名字来进行实际的反注册工作。至于注册表。可以对用户执行权限做一点改变
Header: Declared in Psapi.h.
Library: Use Psapi.lib.
加了一句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.
加入psapi.lib
感谢这么多高手来看一个菜鸟写的垃圾代码!问题基本上算解决了。
特别要感谢的是waiwaiwai(我总不明白) 等网友的热心帮助。
分数我已经加了,请各位查收:)
为什么我现在看帖子上分数都为零???
可是我点管理就看到分数都加了。