2009-06-10 1 views
2

다른 프로그램의 목록보기에서 선택한 항목을 선택할 수 있기를 원하며 코드에 액세스 할 수 없습니다. 사실, 그것은 동일하다고 가정하는 SysListView32입니다. 난 이미 컴파일에도 불구하고, 아무것도하지 않는 것 (SendMessage()가 1을 반환하지만) 다음 코드를 가지고있다.다른 프로그램의 목록보기 선택한 항목

process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, 0xD14); 

_lvi=(LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE); 

lvi.state = LVIS_SELECTED | LVIS_FOCUSED; 
lvi.stateMask = LVIS_SELECTED | LVIS_FOCUSED; 

WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL); 
int abc = ::SendMessage((HWND)0x00050D30, LVM_SETITEMSTATE, (WPARAM)2, (LPARAM)_lvi); 
VirtualFreeEx(process, _lvi, 0, MEM_RELEASE); 

답변

0

대상 프로세스의 메모리로 복사되는 소스 LV_ITEM의 나머지 구성원을 어떻게 초기화합니까? 소스 LV_ITEM의 "mask"멤버에 LVIF_STATE 플래그를 포함하고 있습니까? 그렇지 않으면 ListView는 지정하려고하는 "state"및 "stateMask"값을 무시합니다.

+0

사실 : LVM_SETITEMSTATE는 항목의 상태가 변경되도록 지정합니다. 이 메시지의 경우 .mask는 무시됩니다. – Rom

0

문제가 발생할 경우, 당신은 메모리를 커밋하기 전에 주소 공간을 예약해야 쉽게 목록에서 항목을 선택할 수있는 스크립트를 만들 수 있습니다 AutoHotkey를라는 오픈 소스 프로젝트 등

0

이 있습니다. 당신은 MEM_RESERVE|MEM_COMMIT

1

다음 코드는 나를 위해 마법처럼 작동에 MEM_COMMIT을 변경하여 한 번에 모두 수행 할 수 있습니다

코드가 작동하지 않을 수 있습니다 몇 가지 이유가 있습니다
HANDLE hProcess = OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, 0x0000c130); 
LPVOID epLvi = VirtualAllocEx(hProcess, NULL, 4096, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); 

LVITEM lvi; 
lvi.state = LVIS_FOCUSED | LVIS_SELECTED; 
lvi.stateMask = LVIS_FOCUSED | LVIS_SELECTED; 
SIZE_T cbWritten = 0; 
WriteProcessMemory(hProcess, epLvi, &lvi, sizeof(lvi), &cbWritten); 
DWORD dw = SendMessage((HWND)0x00020C4C, LVM_SETITEMSTATE, 1, (LPARAM)epLvi); 

VirtualFreeEx(hProcess, epLvi, 4096, MEM_DECOMMIT | MEM_RELEASE); 
CloseHandle(hProcess); 

:

  • 로는 Michael Dunn은 주소 공간을 예약하고 커밋해야한다고 언급했습니다. 흥미로운 귀하의 예를 시도에만 MEM_COMMIT 메모리,하지만 그때 MEM_RELEASE의 (어떤 반대로 MEM_RESERVE)입니다;
  • 윈도우를 소유하고있는 프로세스에 대한 권한이 충분하지 않을 수 있습니다.
  • 프로세스와 대상 프로세스가 조금씩 다를 수 있습니다. 이 경우 일부 구조 크기 트릭이 필요할 수 있습니다.

모두 작동하지 않는다면 다른 접근 방식을 시도하는 것이 좋습니다. IAccessible이 도움이 될 수 있습니다. 일반적인 면책 조항 : 다른 프로세스 창과 주소 공간을 망칠 때는 신중한 접근이 필요하며 가능한 경우 피해야합니다.