WinAPI 获取对另一个应用程序控件的访问权限

2023-12-26

我需要从 win 计算器(calc.exe)获取所有控件的列表,并从我的应用程序中按 calc 上的按钮。 我尝试了代码注入,现在可以从 calc 应用程序执行我的代码。在示例中,它发送消息框:

#define PROC_NAME _T("calc.exe")
#define MAX_READ 128
#include <windows.h>
#include <tlhelp32.h>

#pragma comment(linker,"/BASE:0x13140000") 

//-------- My code, which will be executed  from the app-------

DWORD WINAPI func(LPVOID)
{
    LoadLibrary(_T("kernel32.dll")); 
    LoadLibrary(_T("user32.dll"));
    MessageBox(0,_T("Hello from addres area of calculator"),_T("title"),0);
    return true;
}

//-------- find process ---------

DWORD GetProcessID(LPCWSTR lpNameProcess) 
{
    HANDLE snap;
    PROCESSENTRY32 pentry32;
    snap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if(snap==INVALID_HANDLE_VALUE) return 0;
    pentry32.dwSize=sizeof(PROCESSENTRY32);
    if(!Process32First(snap,&pentry32)) {CloseHandle(snap);return 0;}
    do
    {
        if(!lstrcmpi(lpNameProcess,&pentry32.szExeFile[0]))
        {
            CloseHandle(snap);
            return pentry32.th32ProcessID;
        }
    }
    while(Process32Next(snap,&pentry32));
    CloseHandle(snap);
    return 0;
}

//-------- injection to another process -------------------

BOOL Inject(HANDLE hProc,DWORD(WINAPI* func)(LPVOID))
{
    DWORD id;
    DWORD ByteOfWriten;
    HMODULE hModule = GetModuleHandle(NULL);
    DWORD size=((PIMAGE_OPTIONAL_HEADER)((LPVOID)((BYTE*)(hModule)+((PIMAGE_DOS_HEADER)(hModule))->e_lfanew+sizeof(DWORD)+sizeof(IMAGE_FILE_HEADER))))->SizeOfImage;
    char* hNewModule = (char*)VirtualAllocEx(hProc,hModule,size,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
    if(hNewModule==NULL) return false;
    WriteProcessMemory(hProc,hNewModule,hModule,size,&ByteOfWriten);
    if(ByteOfWriten!=size){return false;}
    HANDLE hThread=CreateRemoteThread(hProc,NULL,0,func,(LPVOID)hNewModule,0,&id);
    if(hThread==0) return false;
    return true;
}

int _tmain(int argc, _TCHAR* argv[])
{
    if(!Inject(OpenProcess(PROCESS_ALL_ACCESS,false,GetProcessID(PROC_NAME)),&func)) return false;
}

但是我怎样才能点击按钮并从 calc 上的某些控件获取文本呢?

我如何尝试枚举子窗口:

HWND hwnd, child;
    child = NULL;
    char buf[MAX_STR];          
    hwnd = getMyWnd();  // my own func, returns hwnd to main window 
    do 
    {
        //  here i tried to get child windows
        child = FindWindowExA(hwnd, child, NULL, NULL);
        GetWindowTextA( child, buf, MAX_STR - 1 );
        printf(buf); printf("\n");      
    } while (child != NULL);

我假设您已经获得了所需的按钮手柄

如果是这样,请尝试此 - SendMessage(hButton, BN_CLICKED, 0, 0) 我不记得这些常量,您可能需要查找它们。

更新以获取按钮窗口句柄 - 1.使用EnumChildWindows()枚举计算器的子窗口http://msdn.microsoft.com/en-us/library/ms633494(VS.85).aspx http://msdn.microsoft.com/en-us/library/ms633494(VS.85).aspx

  1. 对于每个这样的窗口,通过使用 GetWindowText 检查其上的文本来查找其是否为按钮http://msdn.microsoft.com/en-us/library/ms633520(VS.85).aspx http://msdn.microsoft.com/en-us/library/ms633520(VS.85).aspx

  2. 制作所有按钮手柄的数组,然后根据您的喜好单击它们:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WinAPI 获取对另一个应用程序控件的访问权限 的相关文章

随机推荐