Мне нужна помощь профессионалов в области Visual C++ WinAPI. Моя задача выполнить команду Code: ListView_SetItemState(listviev, 1, LVIS_SELECTED, LVIS_SELECTED); Проблема в том что это вить чужое адресное пространства, и имея HWND этого окна ListWiew мне все равно просто так не удастся выделить нужную строку. Поэтому мне нужно записать сам код в поток той программы. Для этого нужна функция CreateRemoteThread Вот как реализую ее я. Code: memory = OpenProcess(PROCESS_CREATE_THREAD| PROCESS_QUERY_INFORMATION| PROCESS_VM_OPERATION| PROCESS_VM_WRITE | PROCESS_VM_READ,false,pid); //Открываю процесс CreateRemoteThread(memory,NULL,NULL,ThreadProc ,listviev,0,NULL); А вот код ThreadProc Code: DWORD WINAPI ThreadProc( LPVOID lpParameter){ ListView_SetItemState((HWND)lpParameter, 1, 0xF, LVIS_SELECTED); return 0; } Но при работе кода в чужом приложении ничего не происходит! Помогите мне решить эту проблему! Буду очень благодарен!
Вы меня не поняли, возможно вы просто не работали с такими вещами! Дескриптор SysListView32 у меня уже есть! Вот он listviev! Проблема в том что SendMessage не может передать локальную переменную в другой процесс!
нужно память выделять в целевом процессе под структуру LV_ITEM на С++ сам переделаешь не сложно: Code: procedure Set(hList: THandle); var hProcess, pid: THandle; LV: TLVItem; lpMem: Pointer; cdWrite: DWORD; begin GetWindowThreadProcessId(hList, pid); hProcess:= OpenProcess(PROCESS_CREATE_THREAD or PROCESS_QUERY_INFORMATION or PROCESS_VM_OPERATION or PROCESS_VM_WRITE or PROCESS_VM_READ, True, pid); if (hProcess <> 0) then try lpMem:= VirtualAllocEx(hProcess, nil, sizeof(TLVItem), MEM_COMMIT, PAGE_READWRITE); if (lpMem <> nil) then begin LV.stateMask:= LVIS_SELECTED; LV.state:= LVIS_SELECTED; if WriteProcessMemory(hProcess, lpMem, @LV, sizeof(LV), cdWrite) then begin SendMessage(hList, LVM_SETITEMSTATE, 2, LongInt(lpMem)); end; VirtualFreeEx(hProcess, lpMem, 0, MEM_RELEASE); end; finally CloseHandle(hProcess); end; end;