前段时间我写了一个程序,可以让你选择和修改窗口。它使用WindowFromPoint()
获取鼠标光标下窗口的句柄,并在其上调用GetWindowText()
以获取窗口的标题。这很好用。
然后我添加了获取列表控件列的标题的功能。问题是,与返回宽度的GetColumnWidth()
不同,没有相应的函数来获取标题。相反,获取列标题的标题需要将缓冲区传递给GetColumn()
以填充标题。因此,当我将pszText
结构的LVCOLUMN
成员分配给指向缓冲区的指针并将结构传递给GetColumn()
时,另一个进程将指针解释为在其自己的内存空间中。显然这不起作用。
我使用CodeProject article中的方法解决了这个问题。它运作得很好。但是,我仍然对GetWindowText()
的工作原因感到困惑。
令人困惑,因为GetWindowText()
与GetColumn()
的工作方式相同;它不返回窗口标题,它需要一个缓冲区/变量来放置标题。
那么为什么将一个变量传递给另一个要填充的进程在一个场景中工作而不是另一个场景呢?
这是一个获取窗口标题的片段:
// m_Wnd is a pointer to a window class, pointing to a window in another process
CWnd *m_Wnd=WindowFromPoint(point);
// t is a local variable within this program’s address space
CString t;
// passing a reference to a local variable to another process
m_Wnd->GetWindowText(t); //works correctly!
以下是获取列标题的相应代码段:
// *lc points to a list-control in another process
int colwidth = lc->GetColumnWidth(col); //works correctly!
// local variables
CString colname = _T("");
LVCOLUMN col;
memset(&col, 0, sizeof(col));
col.mask=LVCF_TEXT;
col.cchTextMax=256;
col.pszText=colname.GetBuffer(256); // passing a pointer to local buffer
BOOL ret=lc.GetColumn(colnum, &col); // buffer is empty
colname.ReleaseBuffer();
答案 0 :(得分:2)
GetWindowText
很特别。当您在属于另一个进程的窗口it doesn't actually call the other process to get the text上调用它时。
CListCtrl::GetColumn
是一个调用afxcmn.inl
的内联函数(参见SendMessage
),因此消息转到另一个进程,然后该进程将指针解释在自己的内存中空间。
答案 1 :(得分:0)
这不是答案,而是一个建议......可能是另一个窗口是Unicode。在这种情况下,您可能必须使用wice字符版本才能使其工作。有一个API函数IsWindowUnicode(),它将告诉您给定的窗口是否是本机Unicode。