如何编程实现获取另一个程序里文本控件的内容?
除去利用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;