Что-то я стала отвлекаться...
В общем, пока придумала только как сделать выделенной
n-ю строчку в ListView. Опять с громоздкими функциями резервирования памятив чужом процессе. По-другому у меня не получается.
Код:
procedure SelectItemN(ListViewHandle: HWND; N: Integer);
var
hProcess: THandle;
dwProcessID: DWORD;
dwBytesWriten: DWORD;
plviRemoteLVItem: PLVItem;
lviRemoteLVItem: LV_ITEM;
begin
if ListViewHandle = 0 then Exit;
dwProcessID := 0;
GetWindowThreadProcessId(ListViewHandle, @dwProcessID);
if dwProcessID = 0 then Exit;
hProcess := OpenProcess(PROCESS_ALL_ACCESS, True, dwProcessID);
if hProcess = 0 then Exit;
plviRemoteLVItem := VirtualAllocEx(hProcess, nil, SizeOf(LV_ITEM),
MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
if GetLastError <> 0 then Exit;
ZeroMemory(@lviRemoteLVItem, SizeOf(LV_ITEM));
with lviRemoteLVItem do
begin
mask := LVIF_STATE;
iItem := N;
state := LVIS_FOCUSED or LVIS_SELECTED;
stateMask := LVIS_FOCUSED or LVIS_SELECTED;
end;
if not WriteProcessMemory(hProcess, plviRemoteLVItem, @lviRemoteLVItem,
SizeOf(LV_ITEM), dwBytesWriten) then Exit;
SendMessage(ListViewHandle, LVM_SETITEM, 0, Integer(plviRemoteLVItem));
VirtualFreeEx(hProcess, plviRemoteLVItem, 0, MEM_RELEASE);
CloseHandle(hProcess);
end;
О контекстных меню пока помолчу. Не работала с ними раньше. Вы уверены, что команда может быть вызвана только из контекстного меню? Если есть аналогичная команда в основном меню, то не лучше ли воспользоваться им? Тем более, что рабочий пример уже имеется.
По поводу SpinEdit. Выяснила, что в Windows эти окна имеют класс msctls_updown32 и при прокрутке чисел родительскому окну отсылается сообщение WM_VSCROLL (если стрелочки вертикальные) или WM_HSCROLL (если горизонтальные). Вот этого сообщения, видимо, и не хватает вашему окну...