windows通过进程名查找hwnd,并发送消息


想实现的

        (个人学习记录)想写一个程序,可以找其他进程,并进行一些简单的操作。

一、查找进程——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;
}

补充下:可能要用管理员权限启动

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值