Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.038 c
14-1105941232
WondeRu
2005-01-17 08:53
2005.02.13
Почему институт брака себя не изжил???


1-1106743959
otar
2005-01-26 15:52
2005.02.13
как получить тип фаила от ShellListView


3-1105448998
Doctor Deejay
2005-01-11 16:09
2005.02.13
Где и как прописывать алиасы при запуске на компе без Делфи


14-1104137933
Чеширский_Кот
2004-12-27 11:58
2005.02.13
Кто хочет сыграть против меня в шахматы?


1-1107030167
ASDASD
2005-01-29 23:22
2005.02.13
Два вопроса: Общие точки и Работа Chart





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский