2009-06-10 39 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

你是如何初始化正在被copyied到目標進程的內存源LV_ITEM成員的休息嗎?你是否在源LV_ITEM的「掩碼」成員中包含LVIF_STATE標誌?如果不是,那麼ListView將忽略您要指定的「state」和「stateMask」值。

+0

不是真的:LVM_SETITEMSTATE指定項目的狀態將被更改。對於此消息,.mask被忽略。 – Rom 2009-07-01 06:59:58

0

如果您遇到問題,有一個名爲AutoHotkey的,它可以創建腳本,可以很容易地在列表中選擇項目的一個開源項目,等等

0

你必須提交內存之前預留的地址空間。你可以通過改變MEM_COMMITMEM_RESERVE|MEM_COMMIT

1

下面的代碼工作就像一個魅力對我來說兩者都做一次:

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); 

有幾個原因,爲什麼你的代碼可能無法正常工作:

  • 爲邁克爾鄧恩提到,你需要保留並提交地址空間。有趣的是,你的例子只試圖MEM_COMMIT的內存,但後來MEM_RELEASE的它(它與MEM_RESERVE相反);
  • 您可能沒有足夠的權限擁有窗口的進程;
  • 你的過程和目標過程可能有點不同。在這種情況下可能需要一些結構尺寸技巧。

如果所有不工作,我建議你嘗試了不同的方法:IAccessible可能會有所幫助在這裏。這裏通常的免責聲明:搞亂其他進程窗口和地址空間需要小心,如果可能的話應該避免。

相關問題