钩子功能很简单:读文件(里面可用程序名),根据这个文件判断程序能不能运行。可是我以运行就是“禁止所有新的程序”运行了。请大家帮帮我。#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;
}
#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;
}
Hook函数在正常情况下都要return CallNextHookEx(……
strcmp是区分大小写的,应该用stricmp。
另外,printf等函数是不能用于Hook函数中的。
::DestroyWindow(::GetActiveWindow());这句话有问题,你结束的是当前活动的窗口,
而不是不符合要求的进程.
//结束进程
hprocess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe.th32ProcessID);
TerminateProcess(hprocess);
closehandle(hprocess);
其实你这个没必要做成钩子(HSHELL_WINDOWCREATED
只是当一个窗口创建的时候才起作用的,其实,你也是在窗口创建的时候查询进程的),你可以做一个定时器,查询进程就可以了.