Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.13;
Скачать: CL | DM;

Вниз

И снова о окнах приложений   Найти похожие ветки 

 
tradakad   (2004-12-16 09:45) [0]

Приветствую всех!
я хочу получить список всех открытых окон в винде и делаю это примерно так
Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO
BEGIN
  IF (Wnd <> Application.Handle) AND
  IsWindowVisible(Wnd) AND
  (GetWindow(Wnd, gw_Owner) = 0) AND
  (GetWindowText(Wnd, buff, sizeof(buff)) <> 0)
  THEN
  BEGIN
дальше я обрабатываю buff вобщем я получаю список окон, но теперь возникла необходимость получения иконок с этих приложений, т.е. той иконки которая в левом верхнем углу окна.
ПОдскажите плиз как это сделать или хотя бы где копать.
Спсибо!


 
Игорь Шевченко ©   (2004-12-16 14:13) [1]


function HSGetWindowIcon (WindowHandle: HWND): THandle;
begin
 if SendMessageTimeOut(WindowHandle, WM_GETICON, ICON_SMALL, 0,
     SMTO_NORMAL, 300, Result) = 0 then
   Result := 0;
 if Result = 0 then
   Result := GetClassLong(WindowHandle, GCL_HICONSM);
end;


С уважением,


 
tradakad   (2004-12-16 15:07) [2]

хм. я пробую так

procedure TfMain.getIcons;
begin
if msg.WParam=ICON_SMALL then
begin
ttt:=msg.WParam;
end;

end;
потому что-
The return value is a handle to the large or small icon, depending on the value of wParam. When an application receives this message, it can return a handle to a large or small icon, or pass the message to the DefWindowProc function.
тоесть в ttt по идее будет хендл искомой иконки?


 
Игорь Шевченко ©   (2004-12-16 15:33) [3]


> тоесть в ttt по идее будет хендл искомой иконки?


Нет.

С уважением,


 
tradakad   (2004-12-16 15:38) [4]

ПОнимаете, Ваша функция работает! Спасибо! Но хочу непосредственно ГетИкон обработать или может я как то не правильно (непонятно) пигшу? куда ГетИкон возвращает хендл?


 
Игорь Шевченко ©   (2004-12-16 15:57) [5]

tradakad   (16.12.04 15:38) [4]


> куда ГетИкон возвращает хендл?


в Message.Result

С уважением,


 
tradakad   (2004-12-16 16:29) [6]

А!! действительно! Ж)) теперь ясно.. но теперь вопрос вот в чем. есть PopupMenu Item. как этому итему присвоить иконку по найденному хендлу? Статически реализовывается через ImageList туда добавляю элементы а в итеме указывал индекс рисунка. но как сделать это динакмически?


 
Игорь Шевченко ©   (2004-12-16 17:29) [7]


> Статически реализовывается через ImageList туда добавляю
> элементы а в итеме указывал индекс рисунка. но как сделать
> это динакмически?


Аналогично.

С уважением,


 
tradakad   (2004-12-20 12:53) [8]

все отлично работает но с одним но. некоторые иконки не определяет. я понимаю когда не определяет ProgramManager но неясно когда не видит Оперу? я немного поэкспереметировал и прообую просто пишу GetClassLong(WindowHandle, GCL_HICONSM);
так тоже работает но количество неопределяемых иконок возрастает по экспоненциальной зависимоти (почти) ))
как я подозреваю дело именно в этой функции , что Вы прислали ( ув. Игорь Шевченко)

function TfMain.HSGetWindowIcon (WindowHandle: HWND): THandle;
begin
if SendMessageTimeOut(WindowHandle, WM_GETICON, ICON_SMALL, 0,
SMTO_NORMAL, 300, Result) = 0 then
Result := 0;
if Result = 0 then
Result := GetClassLong(WindowHandle, GCL_HICONSM);
end;

а именно в величине 300, пробовал поизменял ее -но результат остался тот же. чтобы это могло быть? как получить все возможные иконки? или это займет много времени?


 
DVM ©   (2004-12-20 15:47) [9]

function GetIconFromWindow(hWnd: HWND): HICON; stdcall;
const
 ICON_SMALL2 = 2;
begin
 Result := 0;
 // Get Small Icon From Window ...
 SendMessageTimeout(hWnd, WM_GETICON, ICON_SMALL, 0, SMTO_ABORTIFHUNG, 1000, Cardinal(Result));
 if Result = 0 then SendMessageTimeout(hWnd, WM_GETICON, ICON_SMALL2, 0, SMTO_ABORTIFHUNG, 1000, Cardinal(Result));
 if Result = 0 then Result := GetClassLong(hWnd, GCL_HICONSM);
 if Result = 0 then SendMessageTimeout(hWnd, WM_GETICON, ICON_SMALL, 1,
                        SMTO_ABORTIFHUNG, 1000, Cardinal(Result));
 if Result = 0 then SendMessageTimeout(hWnd, WM_GETICON, ICON_SMALL2, 1,
                        SMTO_ABORTIFHUNG, 1000, Cardinal(Result));
 if Result = 0 then SendMessageTimeout(hWnd, WM_QUERYDRAGICON, ICON_SMALL,
                        0, SMTO_ABORTIFHUNG, 1000, Cardinal(Result));
 if Result = 0 then SendMessageTimeout(hWnd, WM_QUERYDRAGICON, ICON_SMALL2,
                       0, SMTO_ABORTIFHUNG, 1000, Cardinal(Result));
 // Get Big Icon From Window ...
 if Result = 0 then SendMessageTimeout(hWnd, WM_GETICON, ICON_BIG, 0, SMTO_ABORTIFHUNG, 1000, Cardinal(Result));
 if Result = 0 then Result := GetClassLong(hWnd, GCL_HICON);
 if Result = 0 then SendMessageTimeout(hWnd, WM_GETICON, ICON_BIG, 1,
                      SMTO_ABORTIFHUNG, 1000, Cardinal(Result));
 if Result = 0 then SendMessageTimeout(hWnd, WM_QUERYDRAGICON, ICON_BIG,
                      0, SMTO_ABORTIFHUNG, 1000, Cardinal(Result));
 // Get Icon From File ...
 if Result = 0 then Result := _GetFileAssociatedIcon(_GetProcessFileNameByWindowHandle(hWnd), true);
 if Result = 0 then Result := _GetFileAssociatedIcon(_GetProcessFileNameByWindowHandle(hWnd), false);
 // Load Default Icon ...  }
 if Result = 0 then Result := LoadIcon(0, IDI_APPLICATION);
end; // End of function GetIconFromWindow


 
DVM ©   (2004-12-20 15:56) [10]

function _GetFileAssociatedIcon(FileName: string; bSmall: boolean): HICON;
var
 FileInfo: SHFILEINFO;
 BIG_OR_SMALL_ICON: integer;
begin
 if bSmall then
   BIG_OR_SMALL_ICON := SHGFI_SMALLICON
 else
   BIG_OR_SMALL_ICON := SHGFI_LARGEICON;
 SHGetFileInfo(PChar(FileName),
               FILE_ATTRIBUTE_NORMAL,
               FileInfo,
               SizeOf(FileInfo),
               SHGFI_ICON or BIG_OR_SMALL_ICON or SHGFI_SYSICONINDEX);
 Result := FileInfo.hIcon;
end;

//------------------------------------------------------------------------------

function _GetProcessFileNameByWindowHandle(Wnd: HWND): string;
var
 hProcess: THandle;
 PID: Cardinal;
 FileName: array [1..MAX_PATH] of char;
 PE: TProcessEntry32;
 Snap: Cardinal;
 OsVerInfo: TOSVersionInfo;
begin
 Result := "";
 GetWindowThreadProcessId(Wnd, @PID);
 hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, PID);
 OsVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
 if GetVersionEx(osVerInfo) then
   begin
     if OsVerInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then
       begin
         ZeroMemory(@Filename[1], SizeOf(Filename));
         GetModuleFileNameEx(hProcess, 0, @Filename[1], SizeOf(Filename));
         Result := FileName;
       end
     else
       begin
         Snap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
         if Snap <> -1 then
           begin
             PE.dwSize:=SizeOf(PE);
             if Process32First(Snap, PE) then
               repeat
                 if PE.th32ProcessID = PID then Result := PE.szExeFile;
               until not Process32Next(Snap, PE);
           end;
       end;
   end;
 CloseHandle(hProcess);
end;


 
tradakad   (2004-12-21 15:45) [11]

говорит что в
function _GetFileAssociatedIcon(FileName: string; bSmall: boolean): HICON;
var
FileInfo: SHFILEINFO;
не знает что такое  SHFILEINFO - как и я вобщем то...


 
DVM ©   (2004-12-21 17:16) [12]


> не знает что такое  SHFILEINFO - как и я вобщем то...

справка знает!


 
tradakad   (2004-12-21 17:21) [13]

ну ладно ладно. уже нашел. чего так сразу кричать то ) вопрос несколько модифицировался. можно ли запихнуть значок в трей если у приложения нет формы? и как это сделать? ведь там нужно использовать хендл окна а как его отследить если нет формы? я писал Application.handle а как поступить в таком случае?


 
DVM ©   (2004-12-22 10:07) [14]


> можно ли запихнуть значок в трей если у приложения нет формы

сделай скрытое окно


 
tradakad   (2004-12-22 10:52) [15]

а без окон? uses Forms добавляет 300 килов в приолжение...


 
DVM ©   (2004-12-23 19:54) [16]

делай на WinApi без использования forms. Будет 10 kb.


 
tradakad   (2004-12-24 12:38) [17]

так я и сделал. только возник вопрос. я создал окно. на нем 2 кнопки. в примере я увидел как назначить обработку нажатия кнопки

procedure Click;
 var Label_Text:PCHAR;
 LText:integer;
begin
что нибудь....
end;

но для чего тода это
function ClickProc(hwnd,msg,wparam,lParam:longint):longint;stdcall;
begin
 Result:=CallWindowProc(pr_Click,hWnd,Msg,wParam,lParam);
 case Msg of
   WM_KEYDOWN : if wparam=9 then SetFocus(hMsgBtn);
 end;
end;

если здесь описанно что если  lparam=hMsgBtn then Click которую я в самом начале написал -

function WindowProc(hwnd, msg, wparam, lparam:longint):longint;stdcall;
begin
 Result:=DefWindowProc(hwnd,msg,wparam,lparam);
 case Msg of
   WM_SIZE : Resize;
   WM_COMMAND : if lparam=hMsgBtn then Click;
   WM_DESTROY : ShutDown;
 end;
end;

и еще .после создания кнопки назначаем кнопке процедуру
но что это значит - я толком не понял...
если можно объясните плз..

 pr_Click:=Pointer(GetWindowLong(hMsgBtn,GWL_WNDPROC));
 SetWindowLong(hMsgBtn,GWL_WNDPROC,Longint(@ClickProc));


 
DVM ©   (2004-12-24 14:43) [18]


> tradakad   (24.12.04 12:38) [17]

http://www.ict.nsc.ru/~cancel/delphi/files/?act=d&id=5


 
tradakad   (2004-12-24 14:57) [19]

Спасибо за хорошую ссылку!



Страницы: 1 вся ветка

Текущий архив: 2005.02.13;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.045 c
4-1103881879
tradakad
2004-12-24 12:51
2005.02.13
ОТображение форму , создаваемой из DLL модально


14-1105507143
NewDelpher
2005-01-12 08:19
2005.02.13
ВТО


14-1106333285
Gero
2005-01-21 21:48
2005.02.13
Два дисковода


14-1106570898
vecna
2005-01-24 15:48
2005.02.13
2 torry !


14-1106686685
Гаврила
2005-01-25 23:58
2005.02.13
Компания "Эскорт" - кто что слышал