想实现的
(个人学习记录)想写一个程序,可以找其他进程,并进行一些简单的操作。
一、查找进程——EnumWindows 查找hwnd
通过EnumWindows枚举所有窗口并传入回调函数EnumWindowsProc2,在函数中判断进程名称,命中后保存hwnd
enumWindows 函数 (winuser.h) - Win32 apps | Microsoft Learn
二、发送消息——PostMessage 发送消息
PostMessageA 函数 (winuser.h) - Win32 apps | Microsoft Learn
如按下4键
PostMessage(hWnd, WM_KEYDOWN, 0x34, 1);
也可以发送 WM_CLOSE 关闭窗口消息等等。
三、全部代码
main函数中定义了名称为 “QRSL.exe"的变量,找到对应进程后持续发送【4键按下消息】。
#include <windows.h>
#include <iostream>
#include <tchar.h>
#include <Psapi.h>
#include <string.h>
HWND hFoundWindow = NULL;
using namespace std;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
DWORD dwID;
GetWindowThreadProcessId(hwnd, &dwID);
if (dwID == (DWORD)lParam)
{
// 找到了窗口句柄,将其保存在全局变量中
hFoundWindow = hwnd;
return FALSE;
}
return TRUE;
}
BOOL CALLBACK EnumWindowsProc2(HWND hwnd, LPARAM lParam)
{
DWORD dwID;
GetWindowThreadProcessId(hwnd, &dwID);
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwID);
if (hProcess == NULL)
{
_tprintf(_T("Could not open process\n"));
return 1;
}
TCHAR filename[MAX_PATH];
GetModuleFileNameEx(hProcess, NULL, filename, MAX_PATH);
_tprintf(_T("Process name: %s\n"), filename);
CloseHandle(hProcess);
wstring currentFileName(filename);
if (currentFileName.find((LPCWSTR)lParam) != std::string::npos)
{
// 找到了窗口句柄,将其保存在全局变量中
hFoundWindow = hwnd;
return FALSE;
}
return TRUE;
}
HWND FindWindowByProcessId(DWORD dwProcessId)
{
hFoundWindow = NULL;
EnumWindows(EnumWindowsProc, (LPARAM)dwProcessId);
return hFoundWindow;
}
HWND FindWindowByProcessName(LPCWSTR processName)
{
hFoundWindow = NULL;
EnumWindows(EnumWindowsProc2, (LPARAM)processName);
return hFoundWindow;
}
void PressKey(HWND hWnd, WORD key, DWORD time = 50)
{
PostMessage(hWnd, WM_KEYDOWN, key, 1);
Sleep(time);
PostMessage(hWnd, WM_KEYUP, key, 1);
}
int main()
{
// 获取进程的句柄
LPCWSTR titleName = L"QRSL.exe";
//HWND hWnd = FindWindow(NULL, titleName);
HWND hWnd = FindWindowByProcessName(titleName);
if (hWnd == NULL)
{
std::cerr << "未找到该进程!" << std::endl;
return -1;
}
WORD key;
while (true)
{
key = 0x34; //按键4
PressKey(hWnd, key);
}
return 0;
}