获取指定窗口内的文本

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取指定窗口内的文本相关的知识,希望对你有一定的参考价值。

如何编程实现获取另一个程序里文本控件的内容?

除去利用Debug API调试程序下断点之类比较复杂的方法,我们还可以利用API函数轻松实现这样的功能。

 

1.定义这样的结构体存放进程信息

struct ProcessWindow   
{   
    DWORD dwProcessId;   
    HWND hwndWindow;   
};

2.创建进程

    //创建进程
    if ( !CreateProcess( FileName,NULL,NULL,NULL,FALSE,
        0,NULL,WorkPath,&si,&pi ) ){
        AfxMessageBox( "打开程序失败!" );

        DWORD dwRet = GetLastError();
        CString strText(_T(""));
        strText.Format(_T("%d"), dwRet);
        AfxMessageBox("错误代码:"+strText);

        return ;
    }

3.主要查找流程

            ProcessWindow procwin;
            procwin.dwProcessId = pi.dwProcessId;
            procwin.hwndWindow = NULL;

            // 等待新进程初始化完毕
            WaitForInputIdle(pi.hProcess, 5000);

            // 查找主窗口
            EnumWindows(EnumWindowCallBack, (LPARAM)&procwin);
            // 查找编辑控件,获取密码
            EnumChildWindows(procwin.hwndWindow,EnumChildProc,(LPARAM)&PassWord);
            //拷贝密码到剪贴板
            CopyPassWord();

4.提供回调函数

BOOL CALLBACK EnumWindowCallBack(HWND hWnd, LPARAM lParam)   
{   
    ProcessWindow *pProcessWindow = (ProcessWindow *)lParam;   
  
    DWORD dwProcessId;   
    GetWindowThreadProcessId(hWnd, &dwProcessId);   
  
    // 判断是否是指定进程的主窗口   
    if (pProcessWindow->dwProcessId == dwProcessId && IsWindowVisible(hWnd) && GetParent(hWnd) == NULL)   
    {   
        pProcessWindow->hwndWindow = hWnd;   
  
        return FALSE;   
    }   
  
    return TRUE;   
}  

BOOL CALLBACK EnumChildProc(HWND hWnd,LPARAM lParam)
{
    char temp1[256],temp2[256];
    CString& PW = *(CString*)lParam;

    GetClassName(hWnd,temp1,255);

    if(!strcmp(temp1,"Edit"))
    {
        SendMessage(hWnd,WM_GETTEXT,sizeof(temp2)/sizeof(char),(LPARAM)temp2);//EDIT的句柄,消息,接收缓冲区大小,接收缓冲区指针
        //MessageBox(NULL,temp2,"get",MB_OK); 
        PW.Format( "%s",temp2 );

        return 0;
    }

5.接着对获取的字符串进行一些操作,例如拷贝到剪贴板

    if ( OpenClipboard() ){                                        //打开剪贴板
            CString str;
            HANDLE hClip;
            char *pBuf;

            EmptyClipboard();

            hClip = GlobalAlloc( GMEM_MOVEABLE,PassWord.GetLength() + 1 );
            pBuf = (char*)GlobalLock( hClip );
            strcpy( pBuf,PassWord );
            GlobalUnlock( hClip );
            SetClipboardData( CF_TEXT,hClip );
            CloseClipboard();

            return true;
        }
        else
            return false;

 

以上是关于获取指定窗口内的文本的主要内容,如果未能解决你的问题,请参考以下文章

使用androidx获取片段内的actionBar

从活动中获取片段内的按钮

如何用Python爬取出HTML指定标签内的文本?

如何从设置中获取数据并发送到此片段

vb 获取一个网页内的链接和链接名称

GetWindowTextA - 将指定窗口的标题条文本拷贝到一个缓存区内