Выполнить Выделение ListWiew в чужом приложении

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by CJ1, 12 Jul 2011.

  1. CJ1

    CJ1 New Member

    Joined:
    6 Apr 2009
    Messages:
    29
    Likes Received:
    1
    Reputations:
    0
    Мне нужна помощь профессионалов в области 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;
    }
    Но при работе кода в чужом приложении ничего не происходит!

    Помогите мне решить эту проблему!
    Буду очень благодарен!
     
  2. SHiNiGaMi

    SHiNiGaMi Banned

    Joined:
    3 Jan 2010
    Messages:
    382
    Likes Received:
    55
    Reputations:
    15
    FindWindow, FindWindowEx не катит?
     
  3. CJ1

    CJ1 New Member

    Joined:
    6 Apr 2009
    Messages:
    29
    Likes Received:
    1
    Reputations:
    0
    Вы меня не поняли, возможно вы просто не работали с такими вещами!

    Дескриптор SysListView32 у меня уже есть!
    Вот он listviev!

    Проблема в том что SendMessage не может передать локальную переменную в другой процесс!
     
  4. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    нужно память выделять в целевом процессе под структуру 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;
    
     
  5. CJ1

    CJ1 New Member

    Joined:
    6 Apr 2009
    Messages:
    29
    Likes Received:
    1
    Reputations:
    0
    Спасибо! Все работает!