钩子功能很简单:读文件(里面可用程序名),根据这个文件判断程序能不能运行。可是我以运行就是“禁止所有新的程序”运行了。请大家帮帮我。#include<windows.h>
#include<tlhelp32.h>
#include<string.h>
#include<stdio.h>
HWND gWnd=NULL;
HANDLE hook=NULL;
LRESULT CALLBACK ShellProc(
  int nCode,      // hook code
  WPARAM wParam,  // event-specific information
  LPARAM lParam   // event-specific information
)
{ if(nCode==HSHELL_WINDOWCREATED)
{

char pro[30];
for(int i=0;i<30;i++)
{
pro[i]='\0';
}
FILE* fp;
if((fp=fopen("F:\\机房监控软件\\Client\\proName.txt","r"))==NULL)//打开文件,以便访问。
{
printf("can't open file.\n");
exit(0);
}
char ch;
ch=fgetc(fp);
int j=0,safe=0;
while(ch!=EOF)
{
if(ch!='\n')//获得一个可用进程名。
{
pro[j]=ch;
j++;
}
else 
{
++safe;
for(int i=0;i<30;i++)
{
pro[i]='\0';
}
}
ch=fgetc(fp);
}
fclose(fp); if((fp=fopen("F:\\机房监控软件\\Client\\proName.txt","r"))==NULL)//打开文件,以便访问。
{
printf("can't open file.\n");
exit(0);
}
int k=0;
PROCESSENTRY32 pe; // PROCESSENTRY32结构对象
pe.dwSize=sizeof(pe); 
HANDLE hSnapshot= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);// 创建快照句柄
Process32First(hSnapshot,&pe);// 先搜索系统中第一个进程的信息.
for(int s=0;s<30;s++)
{
pro[s]='\0';
}
while(k<safe)
{
for(int r=0;r<30;r++)
{
pro[r]='\0';
}
char ch2;
ch2=fgetc(fp);
int l=0;
while(ch2!='\n')
{
pro[l]=ch;
l++;
}
if(strcmp(pro,(char*)pe.szExeFile)!=0)
{
//取文件中第二个字符串和进程名比较。
goto done2;
}
else
{
goto done;
}
done2: Process32Next(hSnapshot,&pe);
k++;
}
::DestroyWindow(::GetActiveWindow());
done: CloseHandle(hSnapshot);
fclose(fp);
}
return 1;
}
HANDLE SetHook(HWND m_hWnd)
{
gWnd=m_hWnd;
HANDLE hook=SetWindowsHookEx(WH_SHELL,ShellProc,GetModuleHandle("HOOK"),0);
return hook;
}

解决方案 »

  1.   

    因为你当时使用CreateToolhelp32Snapshot查看的是一次的进程列表,你只能看到在你的软件开启出来之前你要禁止的程序有没有运行。如果要常驻查看,你需要使用定时器,每个几百ms就获取进程列表一次
      

  2.   

    没看懂你要实现的是什么。
    Hook函数在正常情况下都要return CallNextHookEx(……
    strcmp是区分大小写的,应该用stricmp。
    另外,printf等函数是不能用于Hook函数中的。
      

  3.   

    没有调用CallNextHookEx,消息链断了
      

  4.   


    ::DestroyWindow(::GetActiveWindow());这句话有问题,你结束的是当前活动的窗口,
    而不是不符合要求的进程.
    //结束进程
    hprocess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe.th32ProcessID);
    TerminateProcess(hprocess);
    closehandle(hprocess);
    其实你这个没必要做成钩子(HSHELL_WINDOWCREATED
    只是当一个窗口创建的时候才起作用的,其实,你也是在窗口创建的时候查询进程的),你可以做一个定时器,查询进程就可以了.
      

  5.   

    建议还是直接给 Explorer.exe 挂钩比较好,把 CreateProcessExW 挂上钩子,这样直接禁止进程的启动,因为有些程序一旦运行起来就不能关闭,就达不到你的期望,所以最好还是不让运行来得保险。