码迷,mamicode.com
首页 > 其他好文 > 详细

获取指定窗口内的文本

时间:2016-06-03 22:40:13      阅读:692      评论:0      收藏:0      [点我收藏+]

标签:

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

除去利用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;

 

获取指定窗口内的文本

标签:

原文地址:http://www.cnblogs.com/ZRBYYXDM/p/5557664.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!