Посылка сообщение ListView.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by VintProg, 18 Nov 2011.

  1. VintProg

    VintProg New Member

    Joined:
    29 Oct 2011
    Messages:
    38
    Likes Received:
    0
    Reputations:
    0
    как мне выделить итем из списка чужого окна?
    Code:
    SendMessage(GetDlgItem(WinProxifier[PX_PROXY_SETTINGS_WINDOW], 1000), ($1000 + 210), 1, 1);
     
  2. VintProg

    VintProg New Member

    Joined:
    29 Oct 2011
    Messages:
    38
    Likes Received:
    0
    Reputations:
    0
    Может быть ты не понял вопроса? Надо послать чужому окну в ListView сообщение...
     
  3. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Есть сообщения, они начинаются с префикса LVM, ознакомься, я не пробовал, но там есть такое:
     
    #3 xophet, 19 Nov 2011
    Last edited: 19 Nov 2011
  4. VintProg

    VintProg New Member

    Joined:
    29 Oct 2011
    Messages:
    38
    Likes Received:
    0
    Reputations:
    0
    Уже 4 часа парюсь, башка не какушая, подскажите пожалуйста как правильно мне написать?
     
  5. alexey-m

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

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    VintProg, посмотри это
     
  6. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Вот не судьба посмотреть как это делается в VCL???

    Следующее перечисляю если тебе известен Handle ListView'а и индекс того элемента который выделить хочешь(я думаю не составит труда его найти)

    1. Тебе нужно пдключить модуль CommCtrl.
    2. Вызываешь Windows.SetFocus(Handle);
    3. Вызываешь ListView_SetItemState(Handle, Index, LVIS_SELECTED, LVIS_SELECTED);
    В последнем Index - собсна индекс элемента.
     
  7. alexey-m

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

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    Code:
    function ListView_SetItemState(hwndLV: HWND; i: Integer; data, mask: UINT): Bool;
    var
      Item: TLVItem;
    begin
      Item.stateMask := mask;
      Item.state := data;
      Result := Bool( SendMessage(hwndLV, LVM_SETITEMSTATE, i, Longint(@Item)) );
    end;
    
    Jingo Bo
    Item: TLVItem; - находится в твоем адресном пространстве, и когда окно hwndLV, принадлежащее чужому процессу будет обрабатывать сообщение LVM_SETITEMSTATE, и где в качестве параметра указан адрес Item не существующий в нем у тебя вылетит ошибка
     
  8. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Ну да, просто не посмотрел ListView_SetItemState, думал это импортируемая функция.
     
  9. VintProg

    VintProg New Member

    Joined:
    29 Oct 2011
    Messages:
    38
    Likes Received:
    0
    Reputations:
    0
    а что есть pid?
     
  10. alexey-m

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

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    pid (process Id) идентификатор процесса, которому принадлежит окно ListView
     
  11. VintProg

    VintProg New Member

    Joined:
    29 Oct 2011
    Messages:
    38
    Likes Received:
    0
    Reputations:
    0
    ListView_SetItemState(GetDlgItem(WinProxifier[PX_PROXY_SETTINGS_WINDOW], 1000), 0, LVIS_SELECTED, LVIS_SELECTED);

    вот так не побывали?

    1000 - это ID_Control компонента

    итем казалось бы выделился, но не так как нужно... у него квадратик про падает checkBox. и нету синего выделения. Что-то тут не так.
     
    #11 VintProg, 19 Nov 2011
    Last edited: 19 Nov 2011
  12. alexey-m

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

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    макрос ListView_SetItemState работает только, если окно ListView принадлежит вашему процессу, если же нет, то он работать не будет.
    А судя по:
    подразумевается чужой процесс или не?
     
  13. VintProg

    VintProg New Member

    Joined:
    29 Oct 2011
    Messages:
    38
    Likes Received:
    0
    Reputations:
    0
    чужой. Но у меня ошибки пошли, я не мог в чужом процессе выделить на дельфи...
     
    #13 VintProg, 19 Nov 2011
    Last edited: 19 Nov 2011
  14. VintProg

    VintProg New Member

    Joined:
    29 Oct 2011
    Messages:
    38
    Likes Received:
    0
    Reputations:
    0
    На скорую руку:

    procedure SelectList(hList : DWORD; iIndex : Integer);
    var
    pid, hProcess, cdWrite : cardinal;
    lpMem : pointer;
    LV : LV_ITEM;


    begin
    GetWindowThreadProcessId(hList, pid);

    if pid <> 0 then
    begin
    hProcess := OpenProcess(PROCESS_VM_WRITE or PROCESS_VM_OPERATION, TRUE, pid);
    lpMem := VirtualAllocEx(hProcess, nil, sizeof(LV_ITEM), MEM_COMMIT, PAGE_READWRITE);
    LV.state := LVIS_SELECTED;
    LV.mask := LVIS_SELECTED;
    WriteProcessMemory(hProcess, lpMem, @LV, sizeof(LV_ITEM), cdWrite);
    SendMessage(hList, LVM_SETITEMSTATE, WPARAM(iIndex), LPARAM(lpMem));
    end;

    end;
     
    #14 VintProg, 19 Nov 2011
    Last edited: 19 Nov 2011
  15. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    VintProg, если не хочешь проблем со структурами и проблем в понимании работы Windows API, пиши под VS на С или С++. Конечно писать с использованием Windows API можно на любом языке, который поддерживает импорт из DLL, но я считаю это извращением.

    Если полезешь дальше чем окна просто скачай Windows SDK и WDK

    На делфи не напишешь множества интересных штук, если ты увлекаешься системным программированием. Да и размер exe оставляет желать лучшего.
     
    _________________________