代码拉取完成,页面将自动刷新
同步操作将从 精易科技/eapi 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
#include "..\include_eapi_header.h"
#ifdef _WIN32
#undef UNICODE
#include <windows.h>
#include<tlhelp32.h>
#else
#include <unistd.h>
#include <sys/wait.h>
#endif
inline bool kill_process_w(const std::wstring& process_name_or_window_title) {
// 用于存储进程 ID 的变量
unsigned int process_id = 0;
#ifdef _WIN32
// 在 Windows 系统上使用 FindWindow 函数查找窗口句柄
HWND window_handle = FindWindowW(0, process_name_or_window_title.c_str());
if (window_handle) {
GetWindowThreadProcessId(window_handle, (LPDWORD)&process_id);
}
// 如果找到了窗口句柄,就不需要再枚举进程了
if (process_id == 0) {
// 枚举系统中的所有进程
HANDLE snapshot_handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (snapshot_handle == INVALID_HANDLE_VALUE) {
return false;
}
PROCESSENTRY32W process_entry;
process_entry.dwSize = sizeof(PROCESSENTRY32W);
// 遍历每一个进程
if (Process32FirstW(snapshot_handle, &process_entry)) {
do {
// 匹配进程名称
if (process_name_or_window_title == std::wstring(process_entry.szExeFile)) {
process_id = process_entry.th32ProcessID;
break;
}
} while (Process32NextW(snapshot_handle, &process_entry));
}
CloseHandle(snapshot_handle);
}
#else
// 在 Linux 系统上使用 ps 命令查找进程 ID
std::wstring command = L"ps -e -o pid,comm | grep " + process_name_or_window_title;
std::FILE* process_id_file = _wpopen(command.c_str(), L"r");
if (process_id_file) {
std::fscanf(process_id_file, "%d", &process_id);
_pclose(process_id_file);
}
#endif
// 如果没有找到进程 ID,返回 false
if (process_id == 0) {
return false;
}
// 在 Windows 系统上使用 TerminateProcess 函数终止进程
#ifdef _WIN32
HANDLE process_handle = OpenProcess(PROCESS_TERMINATE, 0, process_id);
bool result = TerminateProcess(process_handle, 0) == TRUE;
return result;
#else
int kill_result = _wsystem((L"kill " + std::to_wstring(process_id)).c_str());
// 如果 kill 命令返回 0,表示成功终止进程
return kill_result == 0;
#endif
}
inline bool kill_process_w(const std::string& process_name_or_window_title) {
// 用于存储进程 ID 的变量
unsigned int process_id = 0;
#ifdef _WIN32
// 在 Windows 系统上使用 FindWindow 函数查找窗口句柄
HWND window_handle = FindWindowA(0, process_name_or_window_title.c_str());
if (window_handle) {
GetWindowThreadProcessId(window_handle, (LPDWORD)&process_id);
}
// 如果找到了窗口句柄,就不需要再枚举进程了
if (process_id == 0) {
// 枚举系统中的所有进程
HANDLE snapshot_handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (snapshot_handle == INVALID_HANDLE_VALUE) {
return false;
}
PROCESSENTRY32 process_entry;
process_entry.dwSize = sizeof(PROCESSENTRY32W);
// 遍历每一个进程
if (Process32First(snapshot_handle, &process_entry)) {
do {
// 匹配进程名称
if (process_name_or_window_title == std::string(process_entry.szExeFile)) {
process_id = process_entry.th32ProcessID;
break;
}
} while (Process32Next(snapshot_handle, &process_entry));
}
CloseHandle(snapshot_handle);
}
#else
// 在 Linux 系统上使用 ps 命令查找进程 ID
std::string command = "ps -e -o pid,comm | grep " + process_name_or_window_title;
std::FILE* process_id_file = _popen(command.c_str(), "r");
if (process_id_file) {
std::fscanf(process_id_file, "%d", &process_id);
_pclose(process_id_file);
}
#endif
// 如果没有找到进程 ID,返回 false
if (process_id == 0) {
return false;
}
// 在 Windows 系统上使用 TerminateProcess 函数终止进程
#ifdef _WIN32
HANDLE process_handle = OpenProcess(PROCESS_TERMINATE, 0, process_id);
bool result = TerminateProcess(process_handle, 0) == TRUE;
return result;
#else
int kill_result = std::system(("kill " + std::to_string(process_id)).c_str());
// 如果 kill 命令返回 0,表示成功终止进程
return kill_result == 0;
#endif
}
inline bool kill_process_w(unsigned int process_id) {
if (process_id == 0)
{
return 0;
}
// 在 Windows 系统上使用 TerminateProcess 函数终止进程
#ifdef _WIN32
HANDLE process_handle = OpenProcess(PROCESS_TERMINATE, 0, process_id);
bool result = TerminateProcess(process_handle, 0) == TRUE;
return result;
#else
// 在其他平台上使用 kill 命令终止进程
int kill_result = std::system(("kill " + std::to_string(process_id)).c_str());
// 如果 kill 命令返回 0,表示成功终止进程
return kill_result == 0;
#endif
}
// 调用格式: SDT_BOOL 终止进程, 命令说明: "模拟键盘的输入。"
// 参数<1>: 进程标识 _SDT_ALL, 参数说明: "要终止进程的进程ID、进程名称或窗口标题。"
EAPI_EXTERN_C void eapi_KillProcess_11_eapi(PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
BOOL ret = FALSE;
if (pArgInf->m_dtDataType == SDT_BIN)
{
ret = kill_process_w(std::wstring(args_to_wsdata(pArgInf, 0)));
}
else if (pArgInf->m_dtDataType == SDT_TEXT)
{
ret = kill_process_w(std::string(args_to_sdata(pArgInf, 0)));
}
else if (pArgInf->m_dtDataType == SDT_INT)
{
ret = kill_process_w(pArgInf[0].m_int);
}
pRetData->m_int = ret;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。