Форум: "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