如果代码实现的话可以这么写:
void KillProcess(TCHAR target[]){
DWORD aps[1024], cbNeeded, cbNeeded2, i;
TCHAR buffer[256];
BOOL killed;
HANDLE hProcess;
HMODULE hModule;
killed = FALSE;
EnumProcesses(aps, sizeof(aps), &cbNeeded) for(i = 0; i < cbNeeded/sizeof(DWORD); ++i)
{
if(!(hProcess = OpenProcess(PROCESS_TERMINATE |
PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,FALSE, aps[i])))
continue;
if(!EnumProcessModules(hProcess, &hModule,
sizeof(hModule), &cbNeeded2))
continue;
GetModuleBaseNameA(hProcess, hModule, buffer, 256);
if(lstrcmpi(buffer, target) == 0)
{
if(TerminateProcess(hProcess, 0))
killed = TRUE;
CloseHandle(hProcess);
break;
}
CloseHandle(hProcess);
}
}
按钮的死循环
你的意思是点击按钮后,界面一直无响应吗
如果是这种情况,程序应该是在后台进行大数据的处理,可以采用多线程来解决
如果是点击按钮,按钮的响应函数是死循环,那只能调试代码了
首先根据进程名找到该进程的ID,如已知某进程的进程名为Applicationexe,可以用列举进程的办法找的该进程的ID(前提是系统中有且只有一个这样的进程):
HANDLE hProcessSnap;
TCHAR ProcessName[]="Applicationexe";
DWORD ProcessID=0x00;
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap==INVALID_HANDLE_VALUE)
{
printf("列举进程失败\n");
return ;
}
PROCESSENTRY32 pe32;
pe32dwSize = sizeof(pe32);
BOOL bProcess = Process32First(hProcessSnap, &pe32);
TCHAR buff[1024];
while(bProcess)
{
if(strcmp(ProcessName,pe32szExeFile)==0)
{
ProcessID= pe32th32ProcessID;
break;
}
memset(buff, 0x00, 1024);
bProcess=Process32Next(hProcessSnap, &pe32);
}
if(ProcessID==0)
{
printf("没有找到进程%s", ProcessName);
return;
}
然后把ProcessID作为参数,按照下面这篇文章所说的方法得到该进程的主窗口句柄:>
首先你得定义int g=DETECT,m=VGA;
然后用注册图形驱动registerbgidriver(EGAVGA_driver);(注册图形可有可无具体而定)
最后初始化 initgraph(&g,&m,"");
下面的程序在win-tc下编译通过,楼主可以参考下
#include<stdlibh>
#include<stringh>
#include<graphicsh>
void main()
{
int i,y[12],shu[12],j,n=0,k=1,p=500,s;
char ch[3]="0",zhi[3];
registerbgidriver(EGAVGA_driver);(
initgraph(&g,&m,"");
rectangle(10,5,633,459);
for(n=0;n<12;n++)
do{ y[n]=random(getmaxy());
}while(y[n]>450||y[n]<12);
for(i=0;i<12;i++)
{shu[i]=y[i];
}
for(i=1;i<12;i++)
{ m=i;s=0;
for(j=1;j<12;j++) if(shu[j]>=shu[m]&&shu[j]>12) { m=j;s=1;}
if(s==1) shu[m]=k++;
}
n=0;
for(i=10;i<633;i+=52)
{ line(i,450,i,459);
if(i!=10)
{ bar(i-10,y[n],i+10,459); sprintf(zhi,"%d",shu[n]);outtextxy(i-5,y[n]-10,zhi);}
sprintf(ch,"%d",n++);
outtextxy(i-2,462,ch);
}
getch();
}
DOS中断中断属于汇编层面的内容,可以用asm内联实现:
在windows visual c++下用__asm关键字。
在gcc下用__asm__宏即可。
示例(vc):
#include <stdioh>int main()
{
__asm int 3h;
return 0;
}
这样就可以在C里面写入汇编代码了。
__asm 关键字用于调用内联汇编程序,并且可在 C 或 C++ 语句合法时出现。 它不能单独出现。 必须后跟汇编指令、一组在大括号中的命令、或者至少一对空大括号。 术语 “__asm 块”在此处指任何命令或命令组,不管是否在大括号内。
如果不与大括号一起使用,则 __asm 关键字表示此行的其余部分是一条汇编语言语句。 如果与大括号一起使用,则该关键字表示大括号之间的每一行都是一条汇编语言语句。为了与早期版本兼容,_asm 是 __asm 的同义词。
由于 __asm 关键字是语句分隔符,因此您可以将程序集指令放在同一行中。
在 Visual C++ 2005 之前,指令
__asm int 3
不会导致在使用 /clr 编译时生成本机代码;编译器会将该指令转换为 CLR 中断指令。
__asm int 3 现在将导致为函数生成本机代码。 如果您希望函数导致代码中出现断点,还希望将函数编译为 MSIL,请使用 __debugbreak。
以上就是关于VC如何强制结束程序进程全部的内容,包括:VC如何强制结束程序进程、vc 如何中断按钮的死循环、VC 关闭 进程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)