怎样获得其他程序中控件的内容?

setsailgo 2004-01-17 02:07:58
怎样获得其他程序中控件的内容?
如列表框中的列表项。
...全文
76 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
stonesky 2004-01-20
  • 打赏
  • 举报
回复
void CGetPSWDlg::OnGetpsw()
{
::SetCursor(::LoadCursor(NULL, IDC_CROSS));
::SetCapture(this->m_hWnd);
}

void CGetPSWDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
if(GetCapture() == this)
{
CRect rc;
POINT pt;
pt = point;
this->ClientToScreen(&pt);
this->GetWindowRect(&rc);
if(rc.PtInRect(pt))
{
::ReleaseCapture();
}
else
{
HWND hWnd = PtInWindow(pt);
if(hWnd)
{
char psw[256];
if(::SendMessage(hWnd, WM_GETTEXT, 256, (long)psw))
this->m_strPsw = psw;
else
{
m_strPsw.Format("查看信息失败,错误代码:%d", GetLastError());
}
this->UpdateData(FALSE);
}
}
}
CDialog::OnLButtonDown(nFlags, point);
}

HWND hWnd = NULL;

BOOL CALLBACK EnumChildProc(
HWND hwnd, // handle to child window
LPARAM lParam // application-defined value
)
{
//if(::IsWindowEnabled(hwnd))
{
RECT rc;
::GetWindowRect(hwnd, &rc);
POINT pt = *(POINT *)lParam;
if(::PtInRect(&rc, pt))
{
hWnd = hwnd;
return FALSE;
}
}
return TRUE;
}

BOOL CALLBACK EnumWindowsProc(
HWND hwnd, // handle to parent window
LPARAM lParam // application-defined value
)
{
if(::IsWindowVisible(hwnd))
{
RECT rc;
::GetWindowRect(hwnd, &rc);
POINT pt = *(POINT *)lParam;
if(::PtInRect(&rc, pt))
{
::EnumChildWindows(hwnd, EnumChildProc, lParam);
if(hWnd)
return FALSE;
}
}
return TRUE;
}

HWND CGetPSWDlg::PtInWindow(POINT pt)
{
hWnd = NULL;
::EnumWindows(EnumWindowsProc, (long)&pt);
return hWnd;
}
stonesky 2004-01-19
  • 打赏
  • 举报
回复
FindWindow找到目标应用程序
EnumChildWindow找到子窗口
PostMessage向控件发送消息
如WM_GETTEXT获取控件的文本内容
halibut 2004-01-17
  • 打赏
  • 举报
回复
首先你要得到列表框的句柄,有了句柄,就好办了:

HWND hwnd;
...//得到句柄

CListBox lb;
lb.Attach(hwnd); //让lb与hwnd关联

//现在通过lb就可以访问它了!

lb.Detch(); //断开关联
binjuny 2004-01-17
  • 打赏
  • 举报
回复
关注中~~~~~~~~~~~~
afantict 2004-01-17
  • 打赏
  • 举报
回复
进程2
if CallNamedPipe(NamedPipeName, CmdMessage, Wr_size, @Rd_buf, Rd_size, RdLen, WaitOrder) = True then begin
Result := pbyte(@Rd_buf);
exit;
end
进程1
//管道通信结束有两个事件:服务停止和通信操作结束
HANDLE hEvents[2] = {NULL, NULL};
hEvents[0] = m_pDmnMain->m_hEvServerStop; //服务停止
hEvents[1] = CreateEvent( //通信操作结束
NULL, // no security attributes
TRUE, // manual reset event
FALSE, // not-signalled
NULL); // no name
if ( hEvents[1] == NULL)
return;
//创建管道
HANDLE hPipe = INVALID_HANDLE_VALUE;
hPipe = CreateNamedPipe(
PIPE_NAME, // 必须是\\.\pipe\pipename格式
FILE_FLAG_OVERLAPPED | //异步的原因:因为有两个信号,如果不是异步,在每次操作的时候都堵塞了,就不能判断服务停止这个信号了
PIPE_ACCESS_DUPLEX, //双方都可以读写
PIPE_TYPE_MESSAGE |
PIPE_READMODE_MESSAGE |
PIPE_WAIT, // pipe IO type
1, // 可以允许生成的最大管道的对象数目,我们只设定一个,否则就混乱了
0, // size of outbuf (0 == allocate as necessary)
0, // size of inbuf
1000, // default time-out value
&sa); // ACL安全属性
if (hPipe == INVALID_HANDLE_VALUE)
{
AddToMessageLog(TEXT("Unable to create named pipe"));
return;
}

//管道建立成功,开始工作
while (1)
{
//异步结构
OVERLAPPED os;
memset( &os, 0, sizeof(OVERLAPPED) );
os.hEvent = hEvents[1]; //把通信结束这个信号赋予异步结构
ResetEvent( hEvents[1] ); //使不发信号

//异步等待连接管道,马上返回,根据GetLastError判断是否PENDING,等待
ConnectNamedPipe(hPipe, &os);
if ( GetLastError() == ERROR_IO_PENDING )
{
dwWait = WaitForMultipleObjects( 2, hEvents, FALSE, INFINITE ); //等待任何两个事件
if ( dwWait != WAIT_OBJECT_0+1 ) //如果信号是服务停止,退出程序
break;
}

//使通信工作的信号不发信号赋予异步结构
memset( &os, 0, sizeof(OVERLAPPED) );
os.hEvent = hEvents[1];
ResetEvent( hEvents[1] );

//异步读取管道,马上返回,根据GetLastError判断是否PENDING,等待
if (!ReadFile(
hPipe,
pszIn,
INBUF_SIZE,
&cbRead,
&os)
&& ( GetLastError() == ERROR_IO_PENDING ) )
{
dwWait = WaitForMultipleObjects( 2, hEvents, FALSE, INFINITE );
if ( dwWait != WAIT_OBJECT_0+1 )
break;
GetOverlappedResult(hPipe,&os, &cbRead, TRUE); //把通信工作的信号不发信号
}

//读取完后追加\0
pszIn[cbRead] = '\0';
memset(szOut,0,sizeof(szOut));

//根据读取的第一位来进行操作
switch(pszIn[0])
{
strcpy(szOut, "1");
}

//使通信工作的信号不发信号赋予异步结构
memset( &os, 0, sizeof(OVERLAPPED) );
os.hEvent = hEvents[1];
ResetEvent( hEvents[1] );

//写入管道
if (!WriteFile(
hPipe,
szOut,
dwSize,
&cbWritten,
&os)
&& ( GetLastError() == ERROR_IO_PENDING ) )
{
dwWait = WaitForMultipleObjects( 2, hEvents, FALSE, INFINITE );
if ( dwWait != WAIT_OBJECT_0+1 )
break;
}

//断开连接
DisconnectNamedPipe(hPipe);



afantict 2004-01-17
  • 打赏
  • 举报
回复
进程之间的通信
管道

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧