C++ Win32 遍历窗口

查找指定窗口

#include <iostream>
#include <windows.h>
using namespace std;

int main()
{
    TCHAR szTitle[MAX_PATH] = { 0 };
    HWND hWnd = ::FindWindow(L"#32770", L"x32Inject");
    if (hWnd != NULL)
    {
        // 修改窗口标题
        ::SetWindowText(hWnd, L"Hello World!");
    }
    else
    {
        ::MessageBox(0, L"窗口没找到", L"提示", 0);
    }
    return 0;
}

窗口控制

#include <windows.h>

int main()
{
    TCHAR szTitle[MAX_PATH] = { 0 };
    HWND hWnd = ::FindWindow(L"#32770", L"x32Inject");
    if (hWnd != NULL)
    {
        // 切换窗口
        SwitchToThisWindow(hWnd, false);
        Sleep(5000);
        // 关闭窗口
        ::SendMessage(hWnd, WM_CLOSE, 0, 0);
    }
    else
    {
        ::MessageBox(0, L"窗口没找到", L"提示", 0);
    }
    return 0;
}

查找子窗口

#include <windows.h>

int main()
{
    TCHAR szTitle[MAX_PATH] = { 0 };
    HWND hWnd = ::FindWindow(L"#32770", L"x32Inject");
    if (hWnd != NULL)
    {
        // 查找子窗口
        HWND hEdit = ::FindWindowEx(hWnd, NULL, L"Edit", L"");
        // 设置标题
        ::SetWindowText(hEdit, L"test");
        // 修改内容(本案例,内容和标题是一样的)
        ::SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM)L"Hello World!");
    }
    else
    {
        ::MessageBox(0, L"窗口没找到", L"提示", 0);
    }
    return 0;
}
#include <windows.h>

int main()
{
    TCHAR szTitle[MAX_PATH] = { 0 };
    HWND hWnd = ::FindWindow(L"#32770", L"x32Inject");
    if (hWnd != NULL)
    {
        // 查找子窗口
        HWND hEdit = ::GetDlgItem(hWnd, 0x3EA);
        // 获取内容
        ::SendMessage(hWnd, WM_GETTEXT, MAX_PATH, (LPARAM)szTitle);
        // 修改内容
        ::SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM)L"Hello World!");
    }
    else
    {
        ::MessageBox(0, L"窗口没找到", L"提示", 0);
    }
    return 0;
}

枚举子窗口

#include <windows.h>
#include <stdio.h>

BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
{
    TCHAR szTitle[MAX_PATH] = { 0 };
    ::GetWindowText(hwnd, szTitle, MAX_PATH);
    ;; MessageBox(0, szTitle, L"子窗口", MB_OK);
    return TRUE;
}

int main()
{
    TCHAR szTitle[MAX_PATH] = { 0 };
    HWND hWnd = ::FindWindow(L"#32770", L"x32Inject");
    if (hWnd != NULL)
    {
        ::EnumChildWindows(hWnd, EnumChildProc, NULL);
    }
    else
    {
        ::MessageBox(0, L"窗口没找到", L"提示", 0);
    }
    getchar();
    return 0;
}

枚举所有打开的窗口

#include <windows.h>
#include <stdio.h>

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
    TCHAR szTitle[MAX_PATH] = { 0 };
    ::GetWindowText(hwnd, szTitle, MAX_PATH);
    wprintf(L"%s\n", szTitle);
    if (wcscmp(szTitle, L"x32Inject") == 0)
    {
        ::MessageBox(0, szTitle, L"窗口", 0);
    }
    return TRUE;
}

int main()
{
    ::EnumWindows(EnumWindowsProc, NULL);
    getchar();
    return 0;
}

模拟鼠标点击

#include <windows.h>
#include <stdio.h>
// 隐藏控制台运行
#pragma comment(linker,"/subsystem:\"windows\"  /entry:\"mainCRTStartup\"")     

int main()
{
    TCHAR szTitle[MAX_PATH] = { 0 };
    RECT r;
    HWND hWnd = ::FindWindow(L"#32770", L"x32Inject");
    if (hWnd != NULL)
    {
        HWND hButton = ::FindWindowEx(hWnd, NULL, L"Button", L"选择程序");
        // 获取选择程序窗口坐标
        ::GetWindowRect(hButton, &r);
        // 设置鼠标位置
        ::SetCursorPos(r.left + 10, r.top + 10);
        Sleep(3000);
        // 鼠标左键单击
        mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); // 按下左键
        mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);  // 松开左键
    }
    else
    {
        ::MessageBox(0, L"没有找到窗口!", L"提示", MB_OK);
    }
    getchar();
    return 0;
}

模拟键盘点击(搜索:键盘键与虚拟键码对照表)

#include <windows.h>
#include <stdio.h>
// 隐藏控制台运行
#pragma comment(linker,"/subsystem:\"windows\"  /entry:\"mainCRTStartup\"")     

int main()
{
    TCHAR szTitle[MAX_PATH] = { 0 };
    RECT r;
    HWND hWnd = ::FindWindow(L"#32770", L"SemaphoreEx");
    if (hWnd != NULL)
    {
        HWND hEdit = ::GetDlgItem(hWnd, 0x3E8);
        // 获取选择程序窗口坐标
        ::GetWindowRect(hEdit, &r);
        // 设置鼠标位置
        ::SetCursorPos(r.left + 1, r.top + 1);
        Sleep(1000);
        // 鼠标左键单击
        mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); // 按下左键
        mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);  // 松开左键
        // 模拟键盘
        keybd_event(97, 0, 0, 0);
        keybd_event(97, 0, KEYEVENTF_KEYUP, 0);
        Sleep(1000);
        keybd_event(66, 0, 0, 0);
        keybd_event(66, 0, KEYEVENTF_KEYUP, 0);
        Sleep(1000);
        keybd_event(16, 0, 0, 0);
        keybd_event(67, 0, 0, 0);
        keybd_event(67, 0, KEYEVENTF_KEYUP, 0);
        keybd_event(16, 0, KEYEVENTF_KEYUP, 0);
    }
    else
    {
        ::MessageBox(0, L"没有找到窗口!", L"提示", MB_OK);
    }
    getchar();
    return 0;
}

原文地址:https://www.cnblogs.com/duxie/p/11142403.html

时间: 2024-10-14 20:53:22

C++ Win32 遍历窗口的相关文章

Delphi 查找标题已知的窗口句柄,遍历窗口控件句柄(转)

Delphi 查找标题已知的窗口句柄,遍历窗口控件句柄(转) 用我的方法来控制其他程序窗体上的窗口控件,必须先了解什么是 回调函数.我的理解是这样的: 回 调函数写出来不是自己的程序去调用的,反而是让其他的东西去调用,比如windows操作系统,比如其他的程序等等之类的.但是什么时候被调用却不知道 了.回调函数一般是按照调用者的要求定义好参数和返回值的类型,你向调用者提供你的回调函数的入口地址,然后调用者有什么事件发生的时候就可以随时按照你 提供的地址调用这个函数通知你,并按照预先规定好的形式传

delphi 遍历窗口

function EnumWindowsProc(hwnd: HWND; lparam: LPARAM): Boolean; stdcall; var buf: array[Byte] of Char; begin Result:= True; GetWindowText(hwnd, buf, SizeOf(buf)); Form1.Memo1.Lines.Add(buf); Form1.Memo1.Lines.Add(IntToStr(hwnd)); end; procedure TForm1

循环遍历窗口控件

在做界面的时候,有的时候须要推断控件是否为空,假设窗口就有一个须要推断那无所谓,直接写一个函数调用即可.但是有的时候窗口中须要推断非常多控件,比方说注冊时那么多的信息都须要推断,还有就是组合查询一类的等等一些信息,这时候再用调用函数就显得异常麻烦了,由于每个都须要进行推断,这得反复非常多遍. 当然有问题就有解决方法.由于推断的控件都是来自一个窗口,所以仅仅须要编写一个函数,循环遍历窗口的每个控件即可.详细例如以下: <span style="color:#009900;">

根据获取的窗口句柄遍历窗口Edit控件

网上说遍历窗口控件有两种方法: 1),使用EnumChildWindows,没有深究, 学习网址如下:http://blog.sina.com.cn/s/blog_60ac1c4b010116uj.html 2),使用::FindWindowEx和GetWindow组合 下面只说第二种方法, 首先根据标题获取窗口的句柄, HWND hWnd=::FindWindow(NULL,"zhang001"); findwindow原型: FindWindow(   lpClassName, 

遍历窗口权限问题

一.问题点:获取桌面窗口数据,但是在系统权限且session0下,获取不到非系统权限且session1下的窗口. 问题分析:在不同权限的session0和session1下遍历窗口,获取的窗口数据是否存在影响? 二.进程权限: 为了系统的安全,Windows系统划分了多种权限来控制用户和程序访问数据的权限,可以有效避免来自病毒的攻击.尤其是在vista系统开始,Windows提供了UAC机制,即使当前登录的用户权限是管理员,运行某些管理员权限的程序或修改需要管理员权限的数据时,系统会弹出一个覆盖

MFC 记录- 遍历窗口

加深记忆------ 经常用到这些,做个记录! 这里列出两种遍历方式... 用到的函数原型: 1 HWND GetWindow( 2 HWND hWnd, // handle to original window 3 UINT uCmd // relationship flag 4 ); 5 6 HWND GetDeskTopWindow(VOID) 7 8 int GetWindowText( 9 HWND hWnd, // handle to window or control with t

]用EnumChildWindows遍历窗口的方法

最近项目有需要,得到一个非自己实现的窗口控件对象.于是想起曾经做过类似功能.总结如下: 调用EnumChildWindows(this->m_hWnd, EnumChildProc, NULL);遍历指定窗口的所有子窗口.这里就是遍历This->m_hWnd的所有子窗口.this从外部窗口继承,外部窗口上的控件就是我们需要查找的对象. 实现BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam) 的窗口遍历回调函数,其中hwndChi

win32中窗口程序的运行过程

win32应用程序只是创建窗口,并不具体的来处理所发的窗口消息,窗口消息由windows调用函数来处理,如WM_CREAT等都是windows里的消息,回调函数通过这些消息来处理窗口过程. 如下图,creatwindow等函数都会向windows发送消息,具体消息怎么处理由windows调用用户函数进行,windows就像一个中间商一样

win32多窗口的建立

本文主要是对win32程序作了一些改动,以此探讨窗口类,窗口的关系. 先说一下窗口与类之间的关系 任何一个窗口都必须属于某一个窗口类,而一个窗口类却可以共享,即可以有多个窗口属于该窗口类.所以窗口和窗口类的关系是一对一的,而窗口类和窗口的关系是一对多. 利用vs建立一个win32程序,会发现vs自动帮你写好了框架,我们再额外建立一个窗口类wxce2a,原有的窗口类建立2个窗口,新的窗口类建立一个窗口. 2Project3.cpp : 定义应用程序的入口点. // #include "stdafx