![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Управление SysListView32 другого приложения [D7, WinXP]
blacksus © (2008-03-26 07:35:00)Доброго времени суток всем! Такая проблема, пытаюсь программно кликнуть по колонке в ListView проводника. Почему-то сообщение не срабатывает, кто сможет помочь хоть чем заранее спасибо!
function GetListViewHandle: THandle; //функция работает только на XP
begin
Result := FindWindow('CabinetWClass', PAnsiChar(Form1.Edit1.Text)); // в 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;
blacksus (2008-03-29 11:21:00) [1]Большое спасибо. Тем не менее проблема все еще висит. Может кто подскажет, что я не правильно в этом коде:
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));
Leonid Troyanovsky (2008-03-28 22:51:00) [2]
> 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.
blacksus (2008-03-26 11:31:00) [3]Тогда у меня 2 вопроса:
1. Реально ли вообще послать сообщение для клика из моего приложения родительскому окну, или это не сработает?
2. Непонятно, зачем тогда вообще существует LVN_COLUMNCLICK?
han_malign (2008-03-26 09:53:00) [4]к тому же заполняется NMHDR и wParam - отнюдь не LVN_COLUMNCLICK - а идентификатор контрола
han_malign (2008-03-26 09:47:00) [5]WM_NOTIFY - шлется контролом родительскому окну...