Skip to content

常用函数

1.控件操作

GetDlgItem()

根据控件ID获取指定对话框中控件的句柄。

c++
HWND GetDlgItem(
  [in, optional] HWND hDlg,
  [in]           int  nIDDlgItem
);

参数:

  • hDlg:包含控件的对话框的句柄。
  • nIDDlgItem:控件ID

返回值:

  • 如果函数成功,则返回值为指定控件的窗口句柄。
  • 如果函数失败,则返回值为 NULL,指示无效的对话框句柄或不存在控件。

GetDlgltemText()

根据控件ID获取指定对话框中控件的标题或文本。

c++
UINT GetDlgItemText(
  [in]  HWND  hDlg,
  [in]  int   nIDDlgItem,
  [out] LPSTR lpString,
  [in]  int   cchMax
);

参数:

  • hDlg:包含控件的对话框的句柄。
  • nIDDlgItem:要检索其标题或文本的控件的ID。
  • lpString:用于接收标题或文本的缓冲区。
  • cchMax:要复制到 lpString 指向的缓冲区的字符串的最大长度(以字符为单位)。 如果字符串的长度(包括 null 字符)超出限制,则字符串将被截断。

返回值:UINT

  • 如果函数成功,则返回值将指定复制到缓冲区的字符数,不包括终止 null 字符。
  • 如果函数失败,则返回值为零

GetDlgltemlnt()

根据控件ID获取指定对话框中控件的标题转化为整数

c++
UINT GetDlgItemInt(
  [in]            HWND hDlg,
  [in]            int  nIDDlgItem,
  [out, optional] BOOL *lpTranslated,
  [in]            BOOL bSigned
);

参数:

  • hDlg:包含相关控件的对话框的句柄。
  • nIDDlgItem:要转换其文本的控件的ID。
  • lpTranslated:指示成功或失败 (TRUE 表示成功, FALSE 表示失败) 。如果此参数为 NULL,则该函数不返回有关成功或失败的信息。
  • bSigned:指示函数是否应在开头检查文本中的减号,如果找到一个有符号整数值,则返回一个有符号整数值 (TRUE 指定应执行此操作, FALSE 表示它不应) 。

返回值:UINT

  • 如果函数成功,则 lpTranslated 指向的变量设置为 TRUE,返回值是控件文本的转换值。
  • 如果函数失败, lpTranslated 指向的 变量设置为 FALSE,返回值为零。 请注意,由于零是可能的转换值,因此返回值零本身并不表示失败。
  • 如果 lpTranslatedNULL,则该函数不返回有关成功或失败的信息。

TIP

请注意,如果 bSigned 参数为 TRUE ,并且文本开头有一个减号 (–) , 则 GetDlgItemInt 会将文本转换为带符号整数值。 否则,函数将创建无符号整数值。 若要在这种情况下获取正确的值,请将返回值强制转换为 int 类型。

GetDlgCtrlID()

根据控件的句柄获取控件ID

c++
int GetDlgCtrlID(
  [in] HWND hWnd
);

参数:

  • hWnd:控件的句柄。

返回值:

  • 如果函数成功,则返回值是控件的标识符。
  • 如果函数失败,则返回值为零

SetDlgltemText()

根据控件ID在对话框中设置控件的标题或文本

c++
BOOL SetDlgItemText(
  [in] HWND   hDlg,
  [in] int    nIDDlgItem,
  [in] LPCSTR lpString
);

参数:

  • hDlg:包含控件的对话框的句柄。
  • nIDDlgItem:具有要设置的标题或文本的控件ID。
  • lpString:要复制到控件的文本。

返回值:BOOL

  • 如果该函数成功,则返回值为非零值。
  • 如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。

SetDlgltemlnt()

根据控件ID在对话框中将整数设置控件的标题或文本

c++
BOOL SetDlgItemInt(
  [in] HWND hDlg,
  [in] int  nIDDlgItem,
  [in] UINT uValue,
  [in] BOOL bSigned
);

参数:

  • hDlg:包含控件的对话框的句柄。
  • nIDDlgItem:具有要设置的标题或文本的控件ID。
  • uValue:用于生成项文本的整数值。
  • bSigned:指示 uValue 参数是有符号的还是无符号的。 如果此参数为 TRUE,则 uValue 为签名。 如果此参数为 TRUEuValue 小于零,则会在字符串中的第一个数字之前放置一个减号。 如果此参数为 FALSE,则 uValue 为无符号。

SendDlgltemMessage()

根据控件ID在对话框中将消息发送到指定的控件

c++
LRESULT SendDlgItemMessage(
  [in] HWND   hDlg,
  [in] int    nIDDlgItem,
  [in] UINT   Msg,
  [in] WPARAM wParam,
  [in] LPARAM lParam
);

参数:

  • hDlg:包含控件的对话框的句柄。
  • nIDDlgItem:具有要设置的标题或文本的控件ID。
  • Msg:要发送的消息。
  • wParam:其他的消息特定信息。
  • lParam:其他的消息特定信息。

返回值: LRESULT

  • 返回值指定消息处理的结果,取决于发送的消息。

TIP

在处理消息之前 ,SendDlgItemMessage 函数不会返回 。

使用 SendDlgItemMessage 与检索指定控件的句柄并调用 SendMessage 函数相同。

2.窗口操作

EnableWindow()

启用或禁用鼠标和键盘输入到指定的窗口或控件

c++
BOOL EnableWindow(
  [in] HWND hWnd,
  [in] BOOL bEnable
);

参数:

  • hWnd:要启用或禁用的窗口的句柄。
  • bEnable:指示是启用或禁用窗口。 如果此参数为 TRUE,则启用窗口。 如果 参数为 FALSE,则禁用窗口。

返回值:BOOL

  • 如果以前禁用窗口,则返回值为非零值。
  • 如果以前未禁用窗口,则返回值为零。

FindWindow()

检索顶级窗口的句柄,该窗口的类名和窗口名称与指定的字符串匹配

c++
HWND FindWindow(
  [in, optional] LPCSTR lpClassName,
  [in, optional] LPCSTR lpWindowName
);

参数:

  • lpClassName:
    • 注册窗口时,使用RegisterClass()RegisterClassEx()函数创建的类名或类原子。 原子必须位于 lpClassName 的低序字中;高序字必须为零。
    • 如果 lpClassName 为一个有效的字符串,则返回第一个类名为lpClassName的窗口句柄。
    • 如果 lpClassNameNULL,它将查找其标题与 lpWindowName 参数匹配的任何窗口。
  • lpWindowName:窗口名称 (窗口标题) 。 如果此参数为 NULL,它将查找其标题与 lpClassName 参数匹配的任何窗口。

返回值:HWND

  • 如果函数成功,则返回值是具有指定类名称和窗口名称的窗口的句柄。
  • 如果函数失败,则返回值为 NULL。 此函数不会修改最后一个错误值。

FindWindowEx()

检索其类名和窗口名称与指定字符串匹配的窗口的句柄。 函数搜索子窗口,从指定子窗口后面的子窗口开始。 此函数不执行区分大小写的搜索。

c++
HWND FindWindowEx(
  [in, optional] HWND   hWndParent,
  [in, optional] HWND   hWndChildAfter,
  [in, optional] LPCSTR lpszClass,
  [in, optional] LPCSTR lpszWindow
);

参数:

  • hWndParent:要搜索其子窗口的父窗口的句柄。
    • 如果 hwndParentNULL,则该函数使用桌面窗口作为父窗口。 函数在桌面子窗口的窗口之间搜索。
    • 如果 hwndParentHWND_MESSAGE,则函数将搜索所有 仅消息窗口
  • hWndChildAfter:子窗口的句柄。 搜索从 Z 顺序中的下一个子窗口开始。 子窗口必须是 hwndParent 的直接子窗口,而不仅仅是后代窗口。
    • 如果 hwndChildAfterNULL,则搜索从 hwndParent 的第一个子窗口开始。
    • 请注意,如果 hwndParenthwndChildAfter 均为 NULL,则该函数将搜索所有顶级窗口和仅消息窗口。
  • lpszClass:由先前调用 RegisterClass 或 RegisterClassEx 函数创建的类名或类原子。 原子必须放在 lpszClass 的低序字中;高序字必须为零。
    • 如果 lpszClass 是字符串,则指定窗口类名称。 类名可以是使用 RegisterClassRegisterClassEx 注册的任何名称,也可以是任何预定义的控件类名称,也可以是 MAKEINTATOM(0x8000)。 在后一种情况下,0x8000是菜单类的原子。 有关详细信息,请参阅本主题的“备注”部分。
  • lpszWindow:窗口名称 (窗口标题) 。 如果此参数为 NULL,则所有窗口名称都匹配。

返回值:HWND

  • 如果函数成功,则返回值是具有指定类和窗口名称的窗口的句柄。
  • 如果函数失败,则返回值为 NULL。 要获得更多的错误信息,请调用 GetLastError。

TIP

FindWindowEx 函数仅搜索直接子窗口。 它不搜索其他后代。

如果 lpszWindow 参数不为 NULL,FindWindowEx 将调用 GetWindowText 函数来检索窗口名称以供比较。 有关可能出现的潜在问题的说明,请参阅 GetWindowText 的“备注”部分。

应用程序可以按以下方式调用此函数。

c++
FindWindowEx( NULL, NULL, MAKEINTATOM(0x8000), NULL );

请注意,0x8000是菜单类的原子。 当应用程序调用此函数时,该函数会检查是否显示应用程序创建的上下文菜单。

EnumWindows()

该函数枚举所有屏幕上的顶层窗口,并将窗口句柄传送给应用程序定义的回调函数。

回调函数返回FALSE将停止枚举,否则EnumWindows函数继续到所有顶层窗口枚举完为止。

c++
BOOL EnumWindows(
    WNDENUMPROC lpEnumFunc,
    LPARAM lParam
)

参数:

  • lpEnumFunc:指向一个应用程序定义的回调函数指针
  • lPararm:指定一个传递给回调函数的应用程序定义值

返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。

回调函数原型:

c++
BOOL CALLBACK EnumWindowsProc(
    HWND hwnd,
    LPARAM lParam
);

参数:

  • hwnd:顶层窗口的句柄
  • lparam:应用程序定义的一个值(即EnumWindows中lParam)

EnumChildindows()

枚举一个父窗口的所有子窗口。

如果回调函数返回true,则枚举继续直到枚举完成;如果返回false,则将会中止枚举。

c++
BOOL EnumChildWindows( 
    HWND hWndParent,
    WNDENUMPROC lpEnumFunc, 
    LPARAM lParam
);

参数:

  • hWndParent: 父窗口句柄
  • lpEnumFunc: 回调函数的地址
  • lParam: 自定义的参数

返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。

回调函数原型

c++
BOOL CALLBACK EnumWindowsProc(
    HWND hwnd,
    LPARAM lParam
);

参数:

  • hwnd:顶层窗口的句柄
  • lparam:应用程序定义的一个值(即EnumWindows中lParam)

SetWindowText()

更改指定窗口标题栏的文本 (如果有)

c++
BOOL SetWindowText(
  [in]           HWND   hWnd,
  [in, optional] LPCSTR lpString
);

参数:

  • hWnd:要更改其文本的窗口或控件的句柄。
  • lpString:新的标题或控件文本。

返回值:

  • 如果该函数成功,则返回值为非零值。
  • 如果函数失败,则返回值为零。

GetWindowText()

获取指定窗口标题栏的文本 (如果有)

c++
int GetWindowText(
  [in]  HWND  hWnd,
  [out] LPSTR lpString,
  [in]  int   nMaxCount
);

参数:

  • hWnd:包含文本的窗口或控件的句柄。
  • lpString:将接收文本的缓冲区。 如果字符串长或长于缓冲区,则字符串将被截断并终止为 null 字符。
  • nMaxCount:要复制到缓冲区的最大字符数,包括 null 字符。 如果文本超出此限制,则会将其截断。

返回值:int

  • 如果函数成功,则返回值为复制的字符串的长度(以字符为单位),不包括终止 null 字符。 如果窗口没有标题栏或文本,如果标题栏为空,或者窗口或控件句柄无效,则返回值为零。
  • 此函数无法检索另一个应用程序中编辑控件的文本。

GetWindowRect()

检索指定窗口的边界矩形的尺寸

c++
BOOL GetWindowRect(
  [in]  HWND   hWnd,
  [out] LPRECT lpRect
);

参数:

  • hWnd:窗口的句柄。
  • lpRect:指向 RECT 结构的指针,该结构接收窗口左上角和右下角的屏幕坐标。

返回值:BOOL

  • 如果该函数成功,则返回值为非零值。
  • 如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。

TIP

RECT 结构

c++
typedef struct tagRECT {
  LONG left;
  LONG top;
  LONG right;
  LONG bottom;
} RECT, *PRECT, *NPRECT, *LPRECT;
  • left:指定矩形左上角的 x 坐标。
  • top:指定矩形左上角的 y 坐标。
  • right:指定矩形右下角的 x 坐标。
  • bottom:指定矩形右下角的 y 坐标。

GetClientRect()

检索指定窗口的客户区矩形的尺寸

c++
BOOL GetWindowRect(
  [in]  HWND   hWnd,
  [out] LPRECT lpRect
);

参数:

  • hWnd:窗口的句柄。
  • lpRect:指向 RECT 结构的指针,该结构接收窗口左上角和右下角的屏幕坐标。

返回值:BOOL

  • 如果该函数成功,则返回值为非零值。
  • 如果函数失败,则返回值为零。

GetClassName()

检索指定窗口所属的类的名称。

c++
int GetClassName(
  [in]  HWND   hWnd,
  [out] LPTSTR lpClassName,
  [in]  int    nMaxCount
);

参数:

  • hWnd:窗口的句柄,以及窗口所属的类的间接句柄。
  • lpClassName:类名字符串。
  • nMaxCount:lpClassName 缓冲区的长度(以字符为单位)。
    • 缓冲区必须足够大,才能包含终止 null 字符;否则,类名字符串将被截断为 nMaxCount-1 字符。

返回值:int

  • 如果函数成功,则返回值是复制到缓冲区的字符数,不包括终止 null 字符。
  • 如果函数失败,则返回值为零。 若要获取扩展的错误信息,请调用 GetLastError 函数

SetFocus()

将键盘焦点设置到指定的窗口

c++
HWND SetFocus(
  [in, optional] HWND hWnd
);

参数:

  • hWnd:将接收键盘输入的窗口的句柄。 如果此参数为 NULL,则忽略击键。

返回值:HWND

  • 如果函数成功,则返回值是以前具有键盘焦点的窗口的句柄。
  • 如果 hWnd 参数无效或窗口未附加到调用线程的消息队列,则返回值为 NULL。
  • 扩展错误ERROR_INVALID_PARAMETER (0x57) 意味着窗口处于禁用状态。

MoveWindow()

更改指定窗口的位置和尺寸

c++
BOOL MoveWindow(
  [in] HWND hWnd,
  [in] int  X,
  [in] int  Y,
  [in] int  nWidth,
  [in] int  nHeight,
  [in] BOOL bRepaint
);

参数:

  • hWnd:窗口的句柄。
  • X:窗口左侧的新位置。
  • Y:窗口顶部的新位置。
  • nWidth:窗口的新宽度。
  • nHeight:窗口的新高度。
  • bRepaint:指示是否重新绘制窗口。
    • 如果此参数为 TRUE,则窗口将收到消息。
    • 如果参数为 FALSE,则不会进行任何类型的重新绘制。
    • 这适用于工作区、非工作区 (包括标题栏和滚动条) ,以及由于移动子窗口而发现父窗口的任何部分。

返回值:BOOL

  • 如果该函数成功,则返回值为非零值。
  • 如果函数失败,则返回值为零。

GetActiveWindow()

检索连接到调用线程的消息队列的活动窗口的窗口句柄。

c++
HWND GetActiveWindow();

返回值:HWND

  • 返回值是附加到调用线程的消息队列的活动窗口的句柄。 否则,返回值为 NULL

EnumWindows()

通过将句柄传递到每个窗口,进而将传递给应用程序定义的回调函数,枚举屏幕上的所有顶级窗口。 枚举窗口 将一直持续到最后一个顶级窗口被枚举或回调函数返回 FALSE

c++
BOOL EnumWindows(
  [in] WNDENUMPROC lpEnumFunc,
  [in] LPARAM      lParam
);

参数:

  • lpEnumFunc:指向应用程序定义的回调函数的指针。 有关详细信息,请参阅 EnumWindowsProc
  • lParam:要传递给回调函数的应用程序定义值。

返回值:BOOL

  • EnumWindows 函数不枚举子窗口,但系统拥有的几个具有WS_CHILD样式的顶级窗口除外

3.进程操作

GetWindowThreadProcessId()

根据窗口句柄获取进程ID

c++
DWORD GetWindowThreadProcessId(
  [in]            HWND    hWnd,
  [out, optional] LPDWORD lpdwProcessId
);

参数:

  • hWnd:窗口的句柄。
  • lpdwProcessId:指向接收进程标识符的变量的指针。 如果此参数不为 NULL则 GetWindowThreadProcessId 会将进程的标识符复制到变量;否则,它不会。 如果函数失败,则变量的值保持不变。

返回值:DWORD

  • 如果函数成功,则返回值是创建窗口的线程的标识符。
  • 如果窗口句柄无效,则返回值为零。

使用实例

c++
HWND hwnd=FindWindow("asd",NULL);

DWORD ProcessId;
GetWindowThreadProcessId(hwnd, &ProcessId);

OpenProcess()

打开现有的本地进程对象

c++
HANDLE OpenProcess(
  [in] DWORD dwDesiredAccess,
  [in] BOOL  bInheritHandle,
  [in] DWORD dwProcessId
);

参数

  • dwDesiredAccess:对进程对象的访问。
    • 针对进程的安全描述符检查此访问权限。 此参数可以是一个或多个 进程访问权限。下面可查看
    • 如果调用方已启用 SeDebugPrivilege 特权,则会授予请求的访问权限,而不考虑安全描述符的内容。
  • bInheritHandle:如果此值为 TRUE,则此进程创建的进程将继承句柄。 否则,进程不会继承此句柄。
  • dwProcessId:要打开的本地进程的标识符
    • 如果指定的进程是系统空闲进程 (0x00000000) ,则函数将失败,最后一个错误代码为 ERROR_INVALID_PARAMETER
    • 如果指定的进程是系统进程或客户端服务器 Run-Time 子系统 (CSRSS) 进程之一,则此函数将失败,最后一个错误代码是 ERROR_ACCESS_DENIED 其访问限制阻止用户级代码打开它们。

返回值HANDLE

  • 如果函数成功,则返回值是指定进程的打开句柄。
  • 如果函数失败,则返回值为 NULL。

使用实例

c++
HWND hwnd=FindWindow("asd",NULL);

DWORD ProcessId;
GetWindowThreadProcessId(hwnd, &ProcessId);

HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, ProcessId);

TIP

dwDesiredAccess可为一下值

含义
PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED (0x000F0000L) |同步 (0x00100000L) |0xFFFF)进程对象的所有可能的访问权限。Windows Server 2003 和 Windows XP: Windows Server 2008 和 Windows Vista 上 PROCESS_ALL_ACCESS 标志的大小增加。 如果为 Windows Server 2008 和 Windows Vista 编译的应用程序在 Windows Server 2003 或 Windows XP 上运行, 则PROCESS_ALL_ACCESS 标志太大,并且指定此标志的函数将失败并 出现ERROR_ACCESS_DENIED。 若要避免此问题,请指定操作所需的最小访问权限集。 如果必须使用 PROCESS_ALL_ACCESS ,请将 _WIN32_WINNT 设置为应用程序 (目标的最低操作系统, #define _WIN32_WINNT _WIN32_WINNT_WINXP 例如,) 。 有关详细信息,请参阅 使用 Windows 标头
PROCESS_CREATE_PROCESS (0x0080)需要将此过程用作 PROC_THREAD_ATTRIBUTE_PARENT_PROCESS的父进程。
PROCESS_CREATE_THREAD (0x0002)在进程中创建线程所必需的。
PROCESS_DUP_HANDLE (0x0040)需要使用 DuplicateHandle 复制句柄。
PROCESS_QUERY_INFORMATION (0x0400)检索有关进程的某些信息(例如其令牌、退出代码和优先级类) (请参阅 OpenProcessToken) 。
PROCESS_QUERY_LIMITED_INFORMATION (0x1000)若要检索有关进程的某些信息, (请参阅 GetExitCodeProcessGetPriorityClassIsProcessInJobQueryFullProcessImageName) 。 PROCESS_QUERY_LIMITED_INFORMATION自动授予具有 PROCESS_QUERY_INFORMATION 访问权限 的句柄Windows Server 2003 和 Windows XP: 不支持此访问权限。
PROCESS_SET_INFORMATION (0x0200)需要设置有关进程的某些信息,例如其优先级类 (请参阅 SetPriorityClass) 。
PROCESS_SET_QUOTA (0x0100)使用 SetProcessWorkingSetSize 设置内存限制所必需的。
PROCESS_SUSPEND_RESUME (0x0800)暂停或恢复进程所必需的。
PROCESS_TERMINATE (0x0001)使用 TerminateProcess 终止进程所必需的。
PROCESS_VM_OPERATION (0x0008)需要对进程的地址空间执行操作 (请参阅 VirtualProtectExWriteProcessMemory) 。
PROCESS_VM_READ (0x0010)使用 ReadProcessMemory 读取进程中的内存所必需的。
PROCESS_VM_WRITE (0x0020)需要使用 WriteProcessMemory 写入进程中的内存。
同步 (0x00100000L)需要使用等待 函数等待进程终止。

ReadProcessMemory()

从指定的进程中读取内存信息

c++
BOOL WriteProcessMemory(
  [in]  HANDLE  hProcess,
  [in]  LPVOID  lpBaseAddress,
  [in]  LPCVOID lpBuffer,
  [in]  SIZE_T  nSize,
  [out] SIZE_T  *lpNumberOfBytesWritten
);

参数

  • hProcess:包含正在读取的内存的进程句柄。 句柄必须具有对进程的PROCESS_VM_READ访问权限。
  • lpBaseAddress:指向从中读取的指定进程中基址的指针。 在进行任何数据传输之前,系统会验证指定大小的基址和内存中的所有数据是否可供读取访问,如果无法访问,则函数将失败。
  • lpBuffer:指向从指定进程的地址空间接收内容的缓冲区的指针。
  • nSize:要从指定进程读取的字节数。
  • lpNumberOfBytesWritten:指向变量的指针,该变量接收传输到指定缓冲区的字节数。 如果 lpNumberOfBytesReadNULL,则忽略 参数。

返回值BOOL

  • 如果该函数成功,则返回值为非零值。
  • 如果函数失败,则返回值为 0(零)。

WriteProcessMemory()

向指定进程中的指定地址写入数据

c++
BOOL WriteProcessMemory(
  [in]  HANDLE  hProcess,
  [in]  LPVOID  lpBaseAddress,
  [in]  LPCVOID lpBuffer,
  [in]  SIZE_T  nSize,
  [out] SIZE_T  *lpNumberOfBytesWritten
);

参数

  • hProcess:要修改的进程内存的句柄。 句柄必须具有对进程的PROCESS_VM_WRITEPROCESS_VM_OPERATION访问权限。
  • lpBaseAddress:指向将数据写入到的指定进程中基址的指针。 在进行数据传输之前,系统会验证指定大小的基址和内存中的所有数据是否可供写入访问,如果无法访问,则函数将失败。
  • lpBuffer:指向缓冲区的指针,该缓冲区包含要写入指定进程的地址空间中的数据。
  • nSize:要写入指定进程的字节数。
  • lpNumberOfBytesWritten:指向变量的指针,该变量接收传输到指定进程的字节数。 此参数是可选的。 如果 lpNumberOfBytesWrittenNULL,则忽略参数。

返回值BOOL

  • 如果该函数成功,则返回值为非零值。
  • 如果函数失败,则返回值为 0(零)。 要获得更多的错误信息,请调用 GetLastError。 如果请求的写入操作交叉到无法访问的进程区域,函数将失败。

ExitProcess()

退出本进程

c++
void ExitProcess(
  [in] UINT uExitCode
);

参数:

  • uExitCode:进程和所有线程的退出代码。

TerminateProcess()

根据进程id结束指定进程

c++
int main() {
	HWND hwnd = FindWindow("WeChatMainWndForPC",NULL);
	if (hwnd) {
		DWORD pid;
		GetWindowThreadProcessId(hwnd, &pid);
		HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid);

		TerminateProcess(hProcess, 0);
	}

	return 0;
}

WinExec()

启动一个程序

c++
UINT WinExec(
  [in] LPCSTR lpCmdLine,
  [in] UINT   uCmdShow
);

参数:

  • lpCmdLine:命令行 (文件名以及要执行的应用程序) 可选参数。 如果 lpCmdLine 参数中的可执行文件的名称不包含目录路径,则系统会按以下顺序搜索可执行文件:

    • 从中加载应用程序的目录。

    • 当前目录。

    • Windows 系统目录。 GetSystemDirectory 函数检索此目录的路径。

    • Windows 目录。 GetWindowsDirectory 函数检索此目录的路径。

    • PATH 环境变量中列出的目录。

  • uCmdShow:显示选项。 有关可接受的值的列表,请参阅 ShowWindow 函数的 nCmdShow 参数的说明。

返回值:

  • 如果函数成功,则返回值大于 31。
  • 如果函数失败,则返回值为以下错误值之一。

ShellExecute()

运行一个外部程序,或者打开一个文件夹

c++
HINSTANCE ShellExecuteA(
  [in, optional] HWND   hwnd,
  [in, optional] LPCSTR lpOperation,
  [in]           LPCSTR lpFile,
  [in, optional] LPCSTR lpParameters,
  [in, optional] LPCSTR lpDirectory,
  [in]           INT    nShowCmd
);

参数:

  • hwnd:用于显示 UI 或错误消息的父窗口的句柄。 如果操作未与窗口关联,则此值可以为 NULL
  • lpOperation:指向以 null 结尾的字符串(在本例中称为 谓词)的指针,指定要执行的操作。 可用谓词集取决于特定的文件或文件夹。 通常,对象的快捷菜单中可用的操作是可用的谓词。 通常使用以下谓词:
  • lpFile:指向 以 null 结尾的字符串的指针,该字符串指定要对其执行指定谓词的文件或对象。 若要指定 Shell 命名空间对象,请传递完全限定分析名称。 请注意,并非所有对象都支持所有谓词。 例如,并非所有文档类型都支持“print”谓词。 如果将相对路径用于 lpDirectory 参数,请不要对 lpFile 使用相对路径。
  • lpParameters:如果 lpFile 指定可执行文件,则此参数是指向以 null 结尾的字符串的指针,该字符串指定要传递给应用程序的参数。 此字符串的格式由要调用的谓词决定。 如果 lpFile 指定文档文件, 则 lpParameters 应为 NULL
  • lpDirectory:指向 以 null 结尾的字符串的指针,该字符串指定操作) 目录的默认 (。 如果此值为 NULL,则使用当前工作目录。 如果在 lpFile 中提供了相对路径,请不要对 lpDirectory 使用相对路径。
  • nShowCmd:指定应用程序在打开时如何显示应用程序的标志。 如果 lpFile 指定文档文件,则标志将直接传递给关联的应用程序。 由应用程序决定如何处理它。 它可以是在 ShowWindow 函数的 nCmdShow 参数中指定的任何值。

system()

执行控制台指令

c++

4.工具函数

MessageBox

显示一个模式对话框,其中包含一个系统图标、一组按钮和一条简短的应用程序特定消息,例如状态或错误信息。 消息框返回一个整数值,该值指示用户单击了哪个按钮。

c++
int MessageBox(
  [in, optional] HWND    hWnd,
  [in, optional] LPCTSTR lpText,
  [in, optional] LPCTSTR lpCaption,
  [in]           UINT    uType
);

参数:

  • hWnd:要创建的消息框的所有者窗口的句柄。 如果此参数为 NULL,则消息框没有所有者窗口
  • lpText:要显示的消息。 如果字符串由多行组成,则可以在每行之间使用回车符和/或换行符分隔这些行。
  • lpCaption:对话框标题。 如果此参数为 NULL,则默认标题为 Error
  • uType:对话框的内容和行为。 此参数可以是以下标志组中的标志的组合。使用|合并多个值

TIP

若要指示消息框中显示的按钮,uType为以下值之一。默认值为MB_OK

含义
MB_ABORTRETRYIGNORE
0x00000002L
消息框包含三个按钮: “中止”、“ **重试”**和 “忽略”。
MB_CANCELTRYCONTINUE
0x00000006L
消息框包含三个按钮: 取消重试继续。 使用此消息框类型而不是MB_ABORTRETRYIGNORE。
MB_HELP
0x00004000L
向消息框添加 “帮助 ”按钮。 当用户单击“ 帮助 ”按钮或按 F1 时,系统会向所有者发送 WM_HELP 消息。
MB_OK
0x00000000L
消息框包含一个按钮: “确定”。 这是默认值。
MB_OKCANCEL
0x00000001L
消息框包含两个按钮: “确定”“取消”。
MB_RETRYCANCEL
0x00000005L
消息框包含两个按钮: 重试取消
MB_YESNO
0x00000004L
消息框包含两个按钮: “是 ”和“ ”。
MB_YESNOCANCEL
0x00000003L
消息框包含三个按钮: “是”、“ **否”**和 “取消”。

若要在消息框中显示图标,请指定以下值之一。

含义
MB_ICONEXCLAMATION
0x00000030L
消息框中会显示一个感叹号图标。
MB_ICONWARNING
0x00000030L
消息框中会显示一个感叹号图标。
MB_ICONINFORMATION
0x00000040L
消息框中将显示一个由圆圈中的小写字母 i 组成的图标。
MB_ICONASTERISK
0x00000040L
消息框中将显示一个由圆圈中的小写字母 i 组成的图标。
MB_ICONQUESTION
0x00000020L
消息框中会显示一个问号图标。 不再建议使用问号消息图标,因为这种图标无法清楚地表示特定类型的消息,并且作为问题的消息表述可应用于任何消息类型。 此外,用户可能会将问号消息符号与帮助信息混淆。 因此,不要在消息框中使用问号消息符号。 系统继续支持它包含的内容,只为满足反向兼容性。
MB_ICONSTOP
0x00000010L
消息框中会显示一个停止符号图标。
MB_ICONERROR
0x00000010L
消息框中会显示一个停止符号图标。
MB_ICONHAND
0x00000010L
消息框中会显示一个停止符号图标。
图标标志值
MB_ICONHAND、MB_ICONSTOP和MB_ICONERROR图标MB_ICONHANDMB_ICONSTOPMB_ICONERROR
MB_ICONQUESTION图标MB_ICONQUESTION
MB_ICONEXCLAMATION和MB_ICONWARNING图标MB_ICONEXCLAMATIONMB_ICONWARNING
MB_ICONASTERISK和MB_ICONINFORMATION图标MB_ICONASTERISKMB_ICONINFORMATION

若要指示默认按钮,请指定以下值之一。

含义
MB_DEFBUTTON1
0x00000000L
第一个按钮是默认按钮。除非 指定了 MB_DEFBUTTON2MB_DEFBUTTON3或MB_DEFBUTTON4,否则 MB_DEFBUTTON1 为默认值。
MB_DEFBUTTON2
0x00000100L
第二个按钮是默认按钮。
MB_DEFBUTTON3
0x00000200L
第三个按钮是默认按钮。
MB_DEFBUTTON4
0x00000300L
第四个按钮是默认按钮。

若要指示对话框的形式,请指定以下值之一。

含义
MB_APPLMODAL
0x00000000L
用户必须先响应消息框,然后才能在 由 hWnd 参数标识的窗口中继续工作。 但是,用户可以移动到其他线程的窗口,并在这些窗口中工作。根据应用程序中窗口的层次结构,用户可能能够移动到线程中的其他窗口。 将自动禁用消息框父级的所有子窗口,但弹出窗口不会禁用。如果未指定MB_SYSTEMMODALMB_TASKMODAL,则MB_APPLMODAL为默认值。
MB_SYSTEMMODAL
0x00001000L
与MB_APPLMODAL相同,只是消息框具有 WS_EX_TOPMOST 样式。 使用系统模式消息框通知用户严重、潜在的破坏性错误,这些错误需要立即关注 (例如内存不足) 。 除了与 hWnd 关联的窗口之外,此标志不会影响用户与窗口交互的能力。
MB_TASKMODAL
0x00002000L
MB_APPLMODAL相同, 但如果 hWnd 参数为 NULL,则禁用属于当前线程的所有顶级窗口。 当调用应用程序或库没有可用的窗口句柄,但仍需要阻止输入调用线程中的其他窗口而不挂起其他线程时,请使用此标志。

若要指定其他选项,请使用以下一个或多个值。

含义
MB_DEFAULT_DESKTOP_ONLY
0x00020000L
与交互式窗口工作站的桌面相同。 有关详细信息,请参阅 窗口工作站。如果当前输入桌面不是默认桌面,则在用户切换到默认桌面之前 ,MessageBox 不会返回。
MB_RIGHT
0x00080000L
文本右对齐。
MB_RTLREADING
0x00100000L
在希伯来语和阿拉伯语系统上使用从右到左的阅读顺序显示消息和描述文字文本。
MB_SETFOREGROUND
0x00010000L
消息框将成为前台窗口。 在内部,系统为消息框调用 SetForegroundWindow 函数。
MB_TOPMOST
0x00040000L
使用 WS_EX_TOPMOST 窗口样式创建消息框。
MB_SERVICE_NOTIFICATION
0x00200000L
调用方是通知用户某个事件的服务。 函数在当前活动桌面上显示一个消息框,即使没有用户登录到计算机也是如此。终端服务: 如果调用线程具有模拟令牌,则函数会将消息框定向到模拟令牌中指定的会话。如果设置了此标志, 则 hWnd 参数必须为 NULL。 这样,消息框就可以出现在与 hWnd 对应的桌面以外的桌面上。有关使用此标志的安全注意事项的信息,请参阅 Interactive Services。 具体而言,请注意,此标志可以在锁定的桌面上生成交互式内容,因此只应用于一组非常有限的方案,例如资源耗尽。

返回值:int

  • 如果消息框有“**取消”**按钮,则如果按下 ESC 键或选择了“取消”按钮,函数将返回 IDCANCEL 值。
  • 如果消息框没有 “取消 ”按钮,则按 ESC 将不起作用 - 除非存在MB_OK按钮。
  • 如果显示MB_OK按钮,并且用户按 ESC,则返回值为 IDOK
  • 如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。
  • 如果函数成功,则返回值为以下菜单项值之一。
返回代码/值说明
IDABORT
3
已选择 “中止 ”按钮。
IDCANCEL
2
已选择 “取消 ”按钮。
IDCONTINUE
11
已选择“ 继续 ”按钮。
IDIGNORE
5
已选择 “忽略 ”按钮。
IDNO
7
已选择 “否 ”按钮。
IDOK
1
已选择 “确定 ”按钮。
IDRETRY
4
已选择 “重试 ”按钮。
IDTRYAGAIN
10
已选择“ 重试 ”按钮。
IDYES
6
已选择 “是 ”按钮。

MIT Licensed