zoukankan      html  css  js  c++  java
  • 获取指定窗口内的文本

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

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

     

  • 相关阅读:
    tyvj 1031 热浪 最短路
    【bzoj2005】 [Noi2010]能量采集 数学结论(gcd)
    hdu 1394 Minimum Inversion Number 逆序数/树状数组
    HDU 1698 just a hook 线段树,区间定值,求和
    ZeptoLab Code Rush 2015 C. Om Nom and Candies 暴力
    ZeptoLab Code Rush 2015 B. Om Nom and Dark Park DFS
    ZeptoLab Code Rush 2015 A. King of Thieves 暴力
    hdoj 5199 Gunner map
    hdoj 5198 Strange Class 水题
    vijos 1659 河蟹王国 线段树区间加、区间查询最大值
  • 原文地址:https://www.cnblogs.com/ZRBYYXDM/p/5557664.html
Copyright © 2011-2022 走看看