2012-03-02 3 views
1

나는 뒤로 선택하고 수정할 수있는 프로그램을 작성했습니다. WindowFromPoint()을 사용하여 마우스 커서 아래의 창에 대한 핸들을 가져오고 그 위에 GetWindowText()을 호출하여 창 제목을 가져옵니다. 이것은 잘 작동합니다.로컬 변수에 대한 포인터를 다른 프로세스에 전달하는 것은 가끔씩 작동합니다.

그런 다음 목록 컨트롤의 열 제목을 가져 오는 기능을 추가했습니다. 문제는 너비를 반환하는 GetColumnWidth()과 달리 제목을 가져 오는 해당 함수가 없다는 것입니다. 대신 열 머리글의 제목을 얻으려면 GetColumn()에 버퍼를 전달하여 제목을 채워야합니다. 따라서 LVCOLUMN 구조체의 pszText 멤버를 버퍼 포인터에 할당하고 구조체를 GetColumn()으로 전달하면 다른 프로세스는 포인터를 자체 메모리 공간으로 해석합니다. 분명히 이것은 작동하지 않을 것입니다.

CodeProject article의 방법을 사용하여 해결했습니다. 그것은 훌륭하게 작동했습니다. 그러나 나는 아직도 왜 GetWindowText() 일을했는지 ​​혼란 스럽다.

GetWindowText()GetColumn()과 동일하기 때문에 혼란 스럽습니다. 그것은 윈도우 제목을 반환하지 않습니다. 제목을 넣기위한 버퍼/변수가 필요합니다.

왜 다른 프로세스로 채워지는 변수를 다른 시나리오로 채우지 만 다른 시나리오에서는 사용할 수 없습니까?

// *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(); 
+1

유사 항목 : http://stackoverflow.com/questions/5688927/how-do-i-find-a-item-in-listview-control – marcinj

+1

@luskan, 감사합니다! 나는 CodeProject에서이 방법을 사용했고 효과가 있었다. 나는 왜'GetWindowText()'가 작동하는지 궁금해하기 때문에 그 부분에 초점을 맞추기 위해 약간의 질문을 다시 써 보겠다. – Synetech

답변

2

GetWindowText은 특별합니다. 다른 프로세스에 속한 창에서 호출하면 it doesn't actually call the other process to get the text.

CListCtrl::GetColumnSendMessage을 호출하는 인라인 함수 (afxcmn.inl 참조)이므로 다른 프로세스로 이동하여 메시지를 자체 메모리 공간에서 해석합니다.

+0

니스; 인지 부조화가 해결되었습니다. 아휴! 고마워 레이몬드. 실제로'SendMessage (WM_GETTEXT) '에 대한 호출로'GetWindowText()'에 대한 호출을 대체하려고 시도했지만 여전히 작동했습니다. 이 줄은 다음과 같을 것입니다 : * WM_GETTEXT가 시스템 메시지 범위 (0에서 WM_USER-1)에 있기 때문에 마샬링 매개 변수를 사용할 필요가 없습니다 (실제로는 안됩니다). 사용자가 마샬링을 수행합니다. * – Synetech

0

이가되지 않습니다 : 여기에


// 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! 
이 칼럼의 제목을 얻을 수있는 해당 코드 조각입니다 : 여기



창 제목을 유도 할 수있는 조각이다 Answer, but suggestion ... 다른 창은 유니 코드 일 수 있습니다. 이 경우, Wice 캐릭터 버전을 사용해야 작동 할 수 있습니다. 주어진 윈도우가 유니 코드 유니 코드인지를 알려주는 API 함수 IsWindowUnicode()가 있습니다.

+0

버퍼는 처리하기에 충분히 크며,'CString' 객체와'_T()'매크로 ('TEXT()'의 MFC 버전)는 이미 문자 너비를 처리합니다. – Synetech

관련 문제