как мне выделить итем из списка чужого окна? Code: SendMessage(GetDlgItem(WinProxifier[PX_PROXY_SETTINGS_WINDOW], 1000), ($1000 + 210), 1, 1);
Вот не судьба посмотреть как это делается в VCL??? Следующее перечисляю если тебе известен Handle ListView'а и индекс того элемента который выделить хочешь(я думаю не составит труда его найти) 1. Тебе нужно пдключить модуль CommCtrl. 2. Вызываешь Windows.SetFocus(Handle); 3. Вызываешь ListView_SetItemState(Handle, Index, LVIS_SELECTED, LVIS_SELECTED); В последнем Index - собсна индекс элемента.
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 не существующий в нем у тебя вылетит ошибка
ListView_SetItemState(GetDlgItem(WinProxifier[PX_PROXY_SETTINGS_WINDOW], 1000), 0, LVIS_SELECTED, LVIS_SELECTED); вот так не побывали? 1000 - это ID_Control компонента итем казалось бы выделился, но не так как нужно... у него квадратик про падает checkBox. и нету синего выделения. Что-то тут не так.
макрос ListView_SetItemState работает только, если окно ListView принадлежит вашему процессу, если же нет, то он работать не будет. А судя по: подразумевается чужой процесс или не?
На скорую руку: 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;
VintProg, если не хочешь проблем со структурами и проблем в понимании работы Windows API, пиши под VS на С или С++. Конечно писать с использованием Windows API можно на любом языке, который поддерживает импорт из DLL, но я считаю это извращением. Если полезешь дальше чем окна просто скачай Windows SDK и WDK На делфи не напишешь множества интересных штук, если ты увлекаешься системным программированием. Да и размер exe оставляет желать лучшего.