-
Доброго времени суток всем! Такая проблема, пытаюсь программно кликнуть по колонке в ListView проводника. Почему-то сообщение не срабатывает, кто сможет помочь хоть чем заранее спасибо!
function GetListViewHandle: THandle; begin
Result := FindWindow('CabinetWClass', PAnsiChar(Form1.Edit1.Text)); if Result = 0 then
raise Exception.Create('Не найден CabinetWClass');
Result := FindWindowEx(Result, 0, 'SHELLDLL_DefView', nil);
if Result = 0 then
raise Exception.Create('Не найден SHELLDLL_DefView');
Result := FindWindowEx(Result, 0, 'DUIViewWndClassName', nil);
if Result = 0 then
raise Exception.Create('Не найден DUIViewWndClassName');
Result := FindWindowEx(Result, 0, 'DirectUIHWND', nil);
if Result = 0 then
raise Exception.Create('Не найден DirectUIHWND');
Result := FindWindowEx(Result, 0, 'CtrlNotifySink', nil);
if Result = 0 then
raise Exception.Create('Не найден CtrlNotifySink');
Result := FindWindowEx(Result, 0, 'SysListView32', nil);
if Result = 0 then
raise Exception.Create('Не найден SysListView32');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
_temp: PNMLISTVIEW;
temp: TNMLISTVIEW;
pid: longint;
proc, Wind: HWND;
null: cardinal;
begin
Wind := GetListViewHandle;
SendMessage(Wind, 4238, 1, 0); GetWindowThreadProcessId(Wind, @pid);
proc := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or
PROCESS_VM_WRITE or PROCESS_QUERY_INFORMATION, FALSE, pid);
try
_temp := VirtualAllocEx(proc, nil, SizeOf(TNMLISTVIEW), MEM_COMMIT, PAGE_READWRITE);
null := 0;
FillChar(temp, SizeOf(temp), 0);
temp.iItem := -1;
temp.iSubItem := 1;
WriteProcessMemory(proc, _temp, @temp, SizeOf(TNMLISTVIEW), null);
SendMessage(Wind, WM_NOTIFY, LVN_COLUMNCLICK, lParam(_Temp)); finally
VirtualFreeEx(proc, _temp, 0, MEM_RELEASE);
end;
end;
-
WM_NOTIFY - шлется контролом родительскому окну...
-
к тому же заполняется NMHDR и wParam - отнюдь не LVN_COLUMNCLICK - а идентификатор контрола
-
Тогда у меня 2 вопроса: 1. Реально ли вообще послать сообщение для клика из моего приложения родительскому окну, или это не сработает? 2. Непонятно, зачем тогда вообще существует LVN_COLUMNCLICK?
-
> blacksus (26.03.08 11:31) [3]
> 2. Непонятно, зачем тогда вообще существует LVN_COLUMNCLICK?
Notifies a list-view control's parent window that a column was clicked.
Можно даже уяснить, что этот парент есть некоторое окно проводника.
-- КRegards, LVT.
-
Большое спасибо. Тем не менее проблема все еще висит. Может кто подскажет, что я не правильно в этом коде:
var
_temp: PNMHDR;
temp: TNMHDR;
begin
Wind := GetListViewHandle;
GetWindowThreadProcessId(Wind, @pid);
proc := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or
PROCESS_VM_WRITE or PROCESS_QUERY_INFORMATION, FALSE, pid);
_temp := VirtualAllocEx(proc, nil, SizeOf(TNMHDR), MEM_COMMIT, PAGE_READWRITE);
null := 0;
temp.hwndFrom := GetListViewHandle;
temp.idFrom := 0;
Wind := GetListViewOwnerHandle;
temp.code := LVN_COLUMNCLICK;
WriteProcessMemory(proc, _temp, @temp, SizeOf(TNMHDR), null);
SendMessage(Wind, WM_NOTIFY, wParam(0), lParam(_Temp));
|