• 获取指定窗口内的文本


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

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

     

  • 相关阅读:
    atitit.按钮光标滑过高亮切换以及其他动态效果的实现css html js attilax总结
    atitit. 文件上传带进度条 atiUP 设计 java c# php
    atitit.新增编辑功能 跟orm的实现 attilax p31
    atitit. java jsoup html table的读取解析 总结
    atitit.设计文档操作日志的实现
    atitit.资源释放机制attilax总结
    (转)Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
    (转)Android笔记handler机制
    (转)数据存储
    (转)android连网详解
  • 原文地址:https://www.cnblogs.com/ZRBYYXDM/p/5557664.html
Copyright © 2020-2023  润新知