1 Star 0 Fork 4

AlongsCode/eapi

forked from 精易科技/eapi 
加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
eapi_11_SimulateKey.cpp 4.82 KB
一键复制 编辑 原始数据 按行查看 历史
AlongsCode 提交于 2023-02-04 02:09 +08:00 . 重构第二次提交
#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;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/alongscode/eapi.git
git@gitee.com:alongscode/eapi.git
alongscode
eapi
eapi
master

搜索帮助