|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
PS:网络上收集的 C 语言 windows.h 库的常用函数,发到这里来,一来便于大家查询,二来便于我自己加入“淘帖”,希望大家能喜欢,
1:FindWindow函数
该函数可以通过窗口类名或者窗口标题名来查找特定窗口句柄,返回值是窗口的句柄(在Windows中,句柄是一个系统内部数据结构的引用。例如当你操作一个窗口,或说是一个Delphi窗体时,系统会给你一个该窗口的句柄,系统会通知你:你正在操作142号窗口,就此你的应用程序就能要求系统对142号窗口进行操作——移动窗口、改变窗口大小、把窗口最小化等等。实际上许多Windows API函数把句柄作为它的第一个参数,如GDI(图形设备接口)句柄、菜单句柄、实例句柄、位图句柄等,不仅仅局限于窗口函数。换句话说,句柄是一种内部代码,通过它能引用受系统控制的特殊元素,如窗口、位图、图标、内存块、光标、字体、菜单等。)
函数用法
#include "stdafx.h"
#include<windows.h>
int main() {
HWND window; //定义一个窗口句柄变量,用来储存窗口句柄
/*FindWindow("这里填窗口类名","这里填窗口标题名")
窗口类名和窗口标题名可以只填一个,不填的用NULL填充*/
window = FindWindow(NULL,"文本.txt - 记事本"); //查找标题为"文本.txt - 记事本"的窗口
SendMessage(window,WM_CLOSE,0,0); //向窗口发送关闭指令
return 0;
}
2:SendMessage函数
刚刚在第一个例子里面已经用到了SendMessage函数,这个函数的功能是向句柄对应窗口发送指令
函数用法
#include "stdafx.h"
#include<windows.h>
int main() {
POINT mouse;
HWND window;
while (1) {
GetCursorPos(&mouse);
window = WindowFromPoint(mouse);
/*SendMessage(窗口句柄,消息类型,消息附带内容,消息附带内容)
比如我这里选定的消息类型是WM_CHAR
消息附带内容为WPARAM('a')
所以消息附带内容就是模拟键盘向窗口输入a*/
SendMessage(window,WM_CHAR,WPARAM('a'),0);
Sleep(100);
}
return 0;
}
3:WindowFromPoint函数
在第二个例子中我们使用了一个叫做WindowFromPoint的函数,这个函数的功能是通过鼠标点击获得被点击窗口的句柄
函数用法
#include "stdafx.h"
#include<windows.h>
int main() {
POINT mouse; //定义一个结构体变量储存鼠标位置
HWND window;
while (1) {
GetCursorPos(&mouse); //获取到当前鼠标位置
/*WindowFromPoint(鼠标位置变量名)*/
window = WindowFromPoint(mouse);
SendMessage(window,WM_CLOSE,0,0);
Sleep(100);
}
return 0;
}
4:GetCursorPos函数
在上一篇中的WindowFromPoint函数的示例代码中就已经用到了GetCursorPos函数,这是一个用于获取鼠标指针位置的函数。
#include<stdio.h>
#include<windows.h>
#include<time.h>
int main(){
POINT mouse; //用来储存鼠标的x y坐标
while(1){
GetCursorPos(&mouse); //调用GetCursorPos函数获取坐标值
printf("%d,%d\n",mouse.x,mouse.y);
Sleep(300);
}
return 0;
}
5:SetCursorPos函数
上一个既然讲到了Get到鼠标的坐标,那么,也一定能Set鼠标的坐标,SetCursorPos函数就是用来设置鼠标坐标的函数。函数的用法就是SetCursorPos(x坐标,y坐标)。
#include<windows.h>
int main(){
int i;
while(i < 100000){
SetCursorPos(100,100);
i += 1;
}
return 0;
}
6:ShowWindow函数
这个函数用来实现对windows窗口包括最大化最小化隐藏在内的操作,具体用法为ShowWindow(句柄变量名,功能)。
功能例如 SW_HIDE 隐藏窗口、SW_MAXIMIZE 最大化窗口、SW_MINIMIZE 最小化窗口、SW_RESTORE 还原窗口。
#include<windows.h>
#include<stdio.h>
#include<time.h>
int main(){
HWND window;
window = FindWindow(NULL,"新建文本文档.txt - 记事本");
ShowWindow(window,SW_HIDE); //隐藏窗口
Sleep(5000);
ShowWindow(window,SW_MAXIMIZE); //最大化窗口
Sleep(5000);
ShowWindow(window,SW_MINIMIZE); //最小化窗口
Sleep(5000);
ShowWindow(window,SW_RESTORE); //还原窗口
Sleep(5000);
return 0;
}
7:SetCursorPos函数
用途
SetCursorPos函数是windows.h库中用来设置指针位置的函数,使用该函数鼠标指针将会直接跳至指定坐标位置
参数
SetCursorPos函数拥有x和y两个整型参数,作为鼠标指针的坐标位置(其中0,0坐标对应屏幕左上角)
示例
#include<windows.h>
int main(){
int a=0;
while(a<1000){
SetCursorPos(1,1); //设置鼠标坐标,其中x最大值不超过屏幕宽度(单位像素,下同),y值不超过屏幕高度
Sleep(100);
a++;
}
return 0;
}
8:GetClientRect函数
用途
GetClientRect函数可以用来获取窗口的尺寸,尺寸信息储存在RECT的right和bottom两个元素中,自我认为其实本质上这个函数是记录了窗口右下角顶点相对于窗口左上角顶点的水平/垂直距离。
参数
GetClientRect函数含有两个参数值,分别是目标窗口的句柄值 (见 C语言windows.h库的常用函数(一)) 和用来储存坐标信息的RECT型数据的内存地址
示例
#include<windows.h>
#include<stdio.h>
int main(){
HWND windows; //句柄变量,第一节中有介绍
while(true){
windows=FindWindow(NULL,"新建文本文档.txt - 记事本");
RECT rectangle; //矩形变量,用于记录矩形四个角的数据
GetClientRect(windows,&rectangle);
printf("%d,%d,%d,%d\n",rectangle.left,rectangle.top,rectangle.right,rectangle.bottom);
Sleep(1000);
}
}
9:GetCWindowRect函数获得窗口大小(客户区)OR(相对屏幕)
用途
此函数功能类似于GetClientRect函数,同样是可以用来获取窗口的尺寸,但是与GetClientRect函数不同的是它的返回值为窗口左上角和窗口右下角顶点相对于屏幕左上角的水平/垂直距离。
参数
与GetClientRect函数相同,GetCWindowRect函数含有的两个参数值,同样是目标窗口的句柄值和用来储存坐标信息的RECT型数据的内存地址
示例
#include<windows.h>
#include<stdio.h>
int main(int argc, char* argv[])
{
HWND wnd;
while(1)
{
wnd=FindWindow(NULL,"无标题.txt - 记事本");
RECT rect;//专门用来存储窗口大小
GetWindowRect(wnd,&rect);//获取窗口大小
printf("%d,%d,%d,%d\n",rect.left,rect.top,rect.right,rect.bottom);//输出窗口大小,试着用鼠标改变窗口大小
Sleep(300);
}
}
或写成:
#include<windows.h>
#include<stdio.h>
int main(){
HWND windows;
while(true){
windows=FindWindow(NULL,"新建文本文档.txt - 记事本");
RECT rectangle;
GetWindowRect(windows,&rect);
printf("%d,%d,%d,%d\n",rectangle.left,rectangle.top,rectangle.right,rectangle.bottom);
Sleep(300);
}
}
10:CopyFile函数
用途
CopyFile函数可以用来复制文件到指定目录。
参数
CopyFile("文件源目录","文件目标目录",TRUE or FALSE);
1
其中第三个参数如果设为TRUE(非零),那么一旦目标文件已经存在,则函数调用会失败。否则目标文件会被覆盖掉。
实例
将D盘根目录1.txt复制到E盘根目录并命名为2.txt
#include <windows.h>
void main(){
CopyFile("d:\\1.txt","e:\\2.txt",FALSE);
}
11:DeleteFile函数
用途
用于删除文件
参数
DeleteFile("要删除的文件路径和文件名");
1
实例
删除D盘根目录下文件test.txt
#include <windows.h>
void main(){
DeleteFile("d:\\test.txt");
}
12:CreateDirectory函数
用途
创建一个目录
参数
CreateDirectory("文件夹路径名",NULL); //一次只能创建一级路径,而不能创建多级路径
1
实例
在D盘根目录创建testdir目录
#include <windows.h>
void main(){
DeleteFile("d:\\testdir",NULL);
}
13:RemoveDirectory函数
用途
创建一个目录
参数
RemoveDirectory("目录路径名"); //只能删除空目录
1
实例
在D盘根目录删除testdir目录
#include <windows.h>
void main(){
RemoveDirectory("d:\\testdir");
}
14:FindFirstFile寻找文件以及获得文件的信息
这里举一个例子吧,列举E盘第一目录下的所有文件,包括文件夹,结合FindNextFile
#include<windows.h>
#include<stdio.h>
int main()
{
BOOL done=TRUE;
WIN32_FIND_DATA fd;
HANDLE hFind = FindFirstFile("e:\\*.*", &fd);//第一个参数是路径名,可以使用通配符,懂DOS的人应该知道吧!fd存储有文件的信息
while (done)
{
printf("%s\n",fd.cFileName);
done=FindNextFile(hFind, &fd); //返回的值如果为0则没有文件要寻了
}
return 0;
}
当然也可以直接找一个文件,不使用通配符,但这样有什么意义呢?,如FindFirstFile("e:\\aaa.txt",&fd);其实这个可以获取一个文件的信息,如文件是不是隐藏的,或者有没有只读属性等。
当然通过控制通配符,也可以寻找特定类型的文件,比如我只要找文本文件,那么就是这个语句FindFirstFile("e:\\*.txt",&fd);就行了,关键看你自己灵活运用。
前面说过fd里存储有文件的信息,那怎么根据fd里面的成员判断这个文件的属性,文件是否隐藏,是不是文件夹。
fd里的dwFileAttributes存储有文件的信息,如判断是否为文件夹,只要把这个变量和FILE_ATTRIBUTE_DIRECTORY进行按位与运算,如果不为0的话,表明为文夹件,如if(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) printf("%s是文件夹\n",fd.cFileName);
其它判断也是一样,现在给出文件的属性(常用几个):FILE_ATTRIBUTE_HIDDEN(隐藏)
FILE_ATTRIBUTE_READONLY(只读)FILE_ATTRIBUTE_SYSTEM(系统)
15:FindNextFile寻找文件
参照FindFirstFile函数的例子!
16:MoveFile移动文件
如把一个盘里的文本移到另一个盘里去:MoveFile("e:\\a.txt","d:\\abc.txt");即可,意思把e盘下的a.txt移到d盘下去,并改名为abc.txt
17:GetClassName根据窗口句柄获得窗口类名
函数定义:int GetClassName(HWND hWnd, LPTSTR IpClassName, intnMaxCount);
这种函数不需要再解释了吧,前面有太多类似的例子。
18:SetFileAttributes设置文件属性
函数定义:BOOL SetFileAttributes( LPCTSTRlpFileName,DWORDdwFileAttributes);
这个函数的第二个参数dwFileAttributes和前面讲过的WIN32_FIND_DATA结构里的dwFileAttributes成员相对应。假设E盘第一目录下有一个文本文件a.txt的正常文件,我要把它设为只读和隐藏那要如何做呢?在前面介绍过WIN32_FIND_DATA结构里dwFileAttributes成员的几个常用属性,根据这个我们知道隐藏是FILE_ATTRIBUTE_HIDDEN,只读是FILE_ATTRIBUTE_READONLY。
那么把E盘下文本文件的属性设为隐藏和只读的语句就是:
SetFileAttributes("e:\\a.txt",FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_READONLY);
(明:这个函数同样也能设置文件夹属性)
虽然这个语句可以达到要求,但不建议用,因为会覆盖掉文件的原来属性,也就是说如果这个文件之前有系统属性(系统文件)的话,那么这个语句一旦执行后,文件就只有隐藏和只读属性了。
比如一个文件原先就有隐藏属性,依旧以a.txt为例子,那么我把它设为只读,是不是这个语句就可以呢?
SetFileAttributes("e:\\a.txt",FILE_ATTRIBUTE_READONLY);这样的话,虽然文件有只读属性了,但隐藏属性却没有了。
那要如何在不覆盖掉原来的属性下,把文件设为只读呢,其实说了这么多的废话,总结起来就一句话:如何增加一个文件的属性!
前提是要获得这个文件的原有属性:获得文件的属性,在FindFirstFile函数讲过。好吧!直接看例子:
假设e盘的a.txt文件属性为隐藏,给它增加只读属性:
#include<windows.h>
int main()
{
WIN32_FIND_DATA fd;
FindFirstFile("e:\\a.txt",&fd);
fd.dwFileAttributes|=FILE_ATTRIBUTE_READONLY;//在原来的属性下增加只读属性
SetFileAttributes("e:\\a.txt",fd.dwFileAttributes);//设置文件的属性
return 0;
}
19:如何去掉一个文件的属性
我想懂这里的按位或、按位与或者按位异或运算的人应该知道该如何去掉一个文件的属性。其实一个文件信息都是以二进制码说明的。
比如一个八位二进制码:10000010,这里的每一位是不是只有0和1取值,不是0,就是1,正好可以表示一个文件属性的有无,如这个文件是隐藏的吗?只有是和不是,这样我们规定把这八位二进制码的第一位用于确定文件是否具有隐藏属性,如果为1那便是隐藏,无则没有,以此类推第二位就代表文件的只读,第三位系统。。。但要如何判断呢,或者把某一位的值改变呢,用按位运算就可以,00000010,我要把第2位的值设为0,
其它位上的值保持不变,用按位异或运算即可,与00000010进行按位异或运算,但这里并不是与它本身进行运算,不管任何八位二进制数的值是多少只要与00000010进行按位异或运算,那第二位都会变成0,而其它的位保持不变。这样为了方便,我们就把00000010进行宏定义,方便记忆,这个二进制数的十进制为2。宏定义#define FILE_ATTRIBUTE_READONLY 2
明白了这个我们就来清除一个文件的一种属性吧!
清除一个文件的隐藏属性,假设a.txt为隐藏文件:
#include<windows.h>
int main()
{
WIN32_FIND_DATA fd;
FindFirstFile("e:\\a.txt",&fd);//获取文件信息
fd.dwFileAttributes^=FILE_ATTRIBUTE_HIDDEN;//在原来的属性下删除隐藏属性
SetFileAttributes("e:\\a.txt",fd.dwFileAttributes);//设置文件的属性
return 0;
}
如果单单只针对文件的属性进行操作的话,可以用GetFileAttributes函数获取文件的属性,该函数只一个参数,那就是文件的路径,函数返回一个DWORD值,包含文件属性信息。
20:ShellExecute运行一个程序
函数定义:ShellExecute(HWND hwnd, LPCSTR lpOperation, LPCSTRlpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd);
第一个参数hwnd是父窗口的句柄,可以为NULL,第二个参数lpOperation表示行为,第三个参数lpFile是程序的路径名,第四个参数lpParameters是给所打开程序的参数,可以为NULL,第五个参数lpDirectory可以为NULL,第六个参数nShowCmd跟ShowWindow函数的第二个参数一样,作用也一样,如果打开的程序有窗口的话,这个参数就指明了窗口如何显示.
例如打开一个记事本:
ShellExecute(NULL,"open","NOTEPAD.EXE",NULL,NULL,SW_SHOWNORMAL);
而且这个函数还可以指定程序打开一个属于程序本身类型的文件,假如e盘有一个a.txt文件;我调用函数运行记事本程序并打开这个文本文件.
ShellExecute(NULL,"open","NOTEPAD.EXE","e:\\a.txt",NULL,SW_SHOWNORMAL);
这里由于记事本程序属于系统本身自带的程序,所以没有绝对路径.
这个函数还可以打开一个网站:
ShellExecute(NULL,"open","http://www.baidu.com",NULL,NULL,SW_SHOWNORMAL);
ShellExecute(NULL,"open","C:",NULL,NULL,SW_SHOWNORMAL);
还可以根据文件后缀名选择相应的程序打开一个文件:
ShellExecute(NULL,"open","e:\\a.bmp",NULL,NULL,SW_SHOWNORMAL);
类似的函数还有WinExec,只有两个参数,它的最后一个参数跟ShellExecute函数的最后一个参数一样.
而第一个参数则是程序路径名.举个例子:WinExec("NOTEPAD.EXE",SW_SHOWNORMAL);
这个函数也可以给程序传递一个文件名供要运行的程序打开,那要如何加进去呢,这里又没有第三个参数,
方法把路径名加在NOTPEPAD.EXE的后面,要以空格来分开如:
WinExec("NOTEPAD.EXE e:\\a.txt",SW_SHOWNORMAL);
21:PlaySound播放一个WAV文件
函数定义:BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORDfdwSound);
第一个参数是WAV文件的路径名,第二个参数如果不是播放MFC里以资源ID命名的文件,则可以为空,第三个参数,指明了以何种方式播放文件。注意这个函数只能播放100K以下的WAV文件。
假如E盘有个a.wav文件,下面这个例子播放这个文件:
#include<windows.h>
#include<mmsystem.h>//PlaySound函数的头文件
#pragma comment(lib, "winmm.lib")//链接库,PlaySound函数必须使用
int main()
{
PlaySound("e:\\19.wav",NULL,SND_SYNC);
return 0;
}
22:GetModuleFileName根据模块导入表获取程序的完整路径
函数定义:DWORD GetModuleFileName( HMODULE hModule, LPTSTRlpFilename, DWORD nSize );
关于第一个参数,将在以后的动态链接库里会有介绍,这里我们只要获得程序本身的路径,那么第一个参数可以为空。
第二个参数用以存储路径,nSize指明字符数组大小。
这个举个例子,运行后,把自身程序移动到e盘下,并改名为a.exe;
#include<windows.h>
int main()
{
char szAppName[128]={0};
GetModuleFileName(NULL,szAppName,128);
MoveFile(szAppName,"e:\\a.exe");
return 0;
}
23:CreatePen创建一个画笔(返回画笔句柄)
CreateSolidBrush创建一个画刷。相当于fun8()设置了 画笔和画刷
void fun10() {
//函数定义:BOOL CreatePen(int nPenStyle, int nWidth, COLORREFcrColor);
//第一个参数,表示是什么类型的线,取值有以下:
//PS_SOLID 画笔画出的是实线 PS_DASH 画笔画出的是虚线(nWidth必须是1) PS_DOT 画笔画出的是点线(nWidth必须是1)
//PS_DASHDOT 画笔画出的是点划线(nWidth必须是1) PS_DASHDOTDOT 画笔画出的是点 - 点 - 划线(nWidth必须是1)
//第二个参数是画笔的宽度,第三个参数是画笔的颜色,COLORREF类型可以RGB来获得如RGB(233, 128, 88); 分别是红绿蓝。
//如创建一个画笔:HPEN pen = CreatePen(PS_SOLID, 3, RGB(255, 78, 99));
24:CreateSolidBrush创建一个画刷
//只有一个COLORREF类型的参数
//HBRUSH brush = CreateSolidBrush(RGB(22, 182, 111));
POINT p;
HPEN hpen = CreatePen(PS_DOT, 1, RGB(7, 47, 231));
HBRUSH hbrush = CreateSolidBrush(RGB(220, 220, 12));
while (1) {
GetCursorPos(&p);
HWND hwnd = WindowFromPoint(p);
HDC hdc = GetDC(hwnd);
SelectObject(hdc, hpen);//选入画笔
SelectObject(hdc, hbrush);//选入画刷
Rectangle(hdc, 20, 20, 120, 120);
Sleep(1);
}
}
25:GetWindowText根据窗口句柄获得窗口标题名
void fun15() {
POINT p;
wchar_t ch[100] = {0};
while (1) {
GetCursorPos(&p);
HWND hwnd = WindowFromPoint(p);
GetWindowText(hwnd, ch, 100);
printf("%ls",ch);
cout << endl;
Sleep(100);
}
}
26:SetWindowText根据窗口句柄设置窗口标题名
void fun16() {
//HWND hwnd = FindWindowA("TXGuiFoundation", "Innocence.等3个会话");
//SetWindowText(hwnd, L"李子果");
SetWindowText((HWND)0x003E0670,L"李子果123");
}
27:GetCurrentProcess获得当前线程句柄
28:OpenProcessToken获得一个进程的访问令牌句柄
void fun17() {
/*
获得一个进程的访问令牌有什么用呢?主要是为了修改它的权限,前面在介绍结束一个进程的时候说过了,
无法结束系统进程,是什么原因呢,原因是调用OpenProcess函数失败,无法获取系统进程句柄而引起的,
那为什么会失败呢,权限不够,普通程序的进程没有SeDeDebug权限,而一个进程的权限是与访问令牌相关的,
这样我们只要获取一个进程的访问令牌句柄,
再以这个句柄为参数调用相应的函数提升进程的权限为SeDeDebug就可以获取系统进程句柄,进而结束它。
*/
//第一个参数ProcessHandle待获取的进程句柄
//第二个参数DesiredAccess操作类型,填TOKEN_ADJUST_PRIVILEGES就行了
//第三个TokenHandle是访问令牌句柄的指针,该参数接收句柄
29:GetCurrentProcess()获取当前进程句柄
TOKEN_ADJUST_PRIVILEGES填这个,接收令牌的指针
HANDLE handle;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,&handle);
//TOKEN_PRIVILEGES是描述进程权限的结构体
//LookupPrivilegeValue函数查看对应系统权限的特权值,返回信息到一个LUID结构体里
//第一个参数lpSystemName通常都填NULL,本地系统调用,第二个参数lpName填要查询的权限名,如要查询的是SeDeDebug权限则取值是SE_DEBUG_NAME,第三个参数lpLuid接收其取值。
//如LUIDluid; LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid);
30:RegisterHotKey注册一个热键
void fun19() {
//第一个参数hWnd表明热键消息(HOT_KEY)发送给哪个窗口,为NULL表明直接把消息投递给调用这个函数进程的消息队列。
//第二个参数可以自定取值,取值范围0xC000 - 0xFFFF, 这个参数是为了程序能同时拥有多个热键而存在。
//第三个参数fsModifiers的可选取值如下:MOD_ALT(Alt键),MOD_CONTROL(Ctrl键),MOD_SHIFT(Shift键),MOD_WIN(‘田’图标键)
//最一个参数是一个ASCII值,指明具体和哪个非系统键组合。
//如QQ的热键ctrl+alt+z,注册这个热键的语句是RegisterHotKey(NULL,0x0001,MOD_CONTROL|MOD_ALT,‘Z’)
//如QQ的截图热键RegisterHotKey(NULL, 0x0001, MOD_CONTROL | MOD_ALT, 'A')
}
int main()
{
//fun5();
//fun8();
fun18();
return 0;
}
31:BitBlt在窗口输出一个位图
void fun14() {
BITMAP bmInfo;//这个结构存储位图信息
HBITMAP bmp;
bmp = (HBITMAP)LoadImage(NULL, L"G:\\瓦力高清2.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
//第一个参数hgdiobj是对象句柄,第二个参数cbBuffer是待写入lpvObject指针指向缓存区数据大小,第三个参数lpvObject是一个指针,指向一个缓存区。
GetObject(bmp, sizeof(BITMAP), &bmInfo);//获取位图信息
HWND wnd = FindWindow(L"Notepad", L"无标题.txt - 记事本");
HDC hdc = GetDC(wnd);
HDC memDC = ::CreateCompatibleDC(hdc);//创造兼容的DC
SelectObject(memDC, bmp);//选入位图
while (1)
{
BitBlt(hdc, 0, 0, bmInfo.bmWidth, bmInfo.bmHeight, memDC, 0, 0, SRCCOPY);//输出位图
Sleep(200);
}
}
32:CreateToolhelp32Snapshot给当前进程拍一个照
//Process32First根据CreateToolhelp32Snapshot函数返回的句柄获取进程信息
//TerminateProcess结束一个进程
void fun9() {
HWND hwnd = FindWindowA("Notepad", "无标题 - 记事本");
DWORD id;
GetWindowThreadProcessId(hwnd, &id);
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, false, id);
TerminateProcess(handle, 0);//第一个是进程句柄,第二个填0就行了
}
|
|