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

Вниз

можноли получить хэндлы всех программ свёрнутых в трей?   Найти похожие ветки 

 
Adios   (2008-03-26 00:52) [0]

сабж


 
Германн ©   (2008-03-26 00:59) [1]


> можноли получить хэндлы всех программ свёрнутых в трей?

1. Никакую программу нельзя свернуть в трей!
2. У программ нет хэндлов.
Так об чём вопрос?


 
Adios   (2008-03-26 01:04) [2]

хэндлы есть у окон, и они свёрнуты в трей и я незнаю названия окон, как можно перебрать все хендлы окон в трее?


 
Германн ©   (2008-03-26 01:29) [3]


> Adios   (26.03.08 01:04) [2]
>
> хэндлы есть у окон, и они свёрнуты в трей и я незнаю названия
> окон, как можно перебрать все хендлы окон в трее?

Никакое окно нельзя свернуть в трей.
В трее есть только иконки. И ничего более.

P.S. Ты бы почитал бы книжки. Это полезно. И пригодится в дальнейшем.


 
Anatoly Podgoretsky ©   (2008-03-26 01:58) [4]

> Adios  (26.03.2008 01:04:02)  [2]

Окна тоже в трей не сворачиваются


 
Семеныч   (2008-03-26 07:46) [5]

> Adios   (26.03.08 01:04) [2]

"Свернуть в трей" - так говорят только для простоты, а вообще-то это выражение неправильное. В действительности трей-программа при запуске:
- создает невидимое окно;
- посылает специальное сообщение пользовательской оболочке системы;
И все. Как видите, ничего никуда не сворачивается.

Отрисовывает иконку оболочка. Она же следит за движениями и щелчками мыши по иконке. Оболочка перенаправляет сообщения мыши невидимому окну программы и то их обрабатывает (показывает меню и пр.). Если надо сменить или удалить  иконку, программа снова посылает оболочке специальное сообщение.

Теперь Вы сами видите, что задали вопрос так, что ответить на него невозможно. В трее нет ни программ, ни окон - и как можно перебрать то, чего нет?

Перебрать все окна в системе - легко (EnumWindows). Определить, какие из них невидимые - тоже легко (IsWindowVisible). Но вот определить, какие из них зарегистрирования в облочке для получения сообщений от иконок (тем более, от конкретной иконки) - это вряд ли получится.


 
easy ©   (2008-03-26 12:09) [6]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, CommCtrl, ShellAPI, TlHelp32, ComCtrls;

type
 TForm1 = class(TForm)
   ListView1: TListView;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

function GetTrayHandle: THandle;
var
 ShellTrayHandle: THandle;
begin
 ShellTrayHandle := FindWindow("Shell_TrayWnd", nil);
 if ShellTrayHandle <> 0 then
   Result := FindWindowEx(ShellTrayHandle, 0, "TrayNotifyWnd", nil)
 else
   Result := 0;
end;

function FindToolbar(Window: THandle; var ToolbarHandle: THandle): BOOL;
 stdcall;
var
 Buf: array[Byte] of Char;
begin
 GetClassName(Window, Buf, SizeOf(Buf));
  // Set result to false when we have found a toolbar
 Result := StrIComp(Buf, TOOLBARCLASSNAME) <> 0;
 if not Result then
   ToolbarHandle := Window;
end;

function GetToolbarHandle: THandle;
var
 TrayHandle: THandle;
begin
 Result := 0;
 TrayHandle := GetTrayHandle;
 if TrayHandle = 0 then
   Exit;
 EnumChildWindows(TrayHandle, @FindToolbar, Longint(@Result));
end;

function GetExenameForProcessUsingToolhelp32(pid: DWORD): string;
var
 snapshot: THandle;
 procentry: TProcessEntry32;
 ret: BOOL;
begin
 SetLastError(0);
 Result := "";
 snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 if snapshot <> INVALID_HANDLE_VALUE then
 try
   procentry.dwSize := Sizeof(procentry);
   ret := Process32FIRST(snapshot, procentry);
   while ret do begin
     if procentry.th32ProcessID = pid then begin
       Result := procentry.szExeFile;
       Break;
     end
     else
       ret := Process32Next(snapshot, procentry);
   end;
 finally
   CloseHandle(snapshot);
 end;
end;

procedure FindTrayProcess(ListView: TListView);
type
 TExtraData = packed record
   Wnd: THandle;
   uID: UINT;
 end;
var
 ToolbarHandle: THandle;
 ProcessID, pid: DWORD;
 Process: THandle;
 ButtonCount: Integer;
 Data: Pointer;
 Index: Integer;
 BytesRead: DWORD;
 Button: TTBButton;
 ExtraData: TExtraData;
 Res: boolean;
 buff: array[0..127] of char;
 ListItem: TListItem;
begin
 ListView.Clear;
  // The trayicons are actually buttons on a toolbar
 ToolbarHandle := GetToolbarHandle;
 if ToolbarHandle = 0 then
   Exit;
 ButtonCount := SendMessage(ToolbarHandle, TB_BUTTONCOUNT, 0, 0);
 if ButtonCount < 1 then
   Exit;
  // We want to get data from another process - it"s not possible
  // to just send messages like TB_GETBUTTON with a locally
  // allocated buffer for return data. Pointer to locally allocated
  // data has no usefull meaning in a context of another
  // process (since Win95) - so we need
  // to allocate some memory inside Tray process.
  // Use @ProcessId for C5/D5 compatibility

 if GetWindowThreadProcessId(ToolbarHandle, @ProcessID) = 0 then
   Exit;

 Process := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessID);
 if Process = 0 then
   Exit;
 try
    // Allocate needed memory in the context of the tray process. We reuse
    // Data to read multiple parts so we set it to the biggest chunk we need
    // (TTBButton)
   Data := VirtualAllocEx(Process, nil, SizeOf(TTBButton), MEM_COMMIT, PAGE_READWRITE);
   if Data = nil then
     Exit;
   try
     for Index := ButtonCount - 1 downto 0 do
     begin
       SendMessage(ToolbarHandle, TB_GETBUTTON, Index, Longint(Data));
       Res := ReadProcessMemory(Process, Data,
         @Button, SizeOf(Button), BytesRead) and (BytesRead = SizeOf(Button));
       if not Res then
         Continue;
       Res := ReadProcessMemory(Process, Pointer(Button.dwData),
         @ExtraData, SizeOf(ExtraData), BytesRead) and (BytesRead = SizeOf(ExtraData));
       if not Res then
         Continue;

       if IsWindow(ExtraData.Wnd) then
       begin
         GetWindowThreadProcessID(ExtraData.Wnd, @pid);
         GetWindowText(ExtraData.Wnd, buff, sizeof(buff));
         ListItem := ListView.Items.Add;
         ListItem.Caption := inttostr(ExtraData.Wnd);
         ListItem.SubItems.Add(buff);
         ListItem.SubItems.Add(GetExenameForProcessUsingToolhelp32(pid));
       end;
     end;
   finally
     VirtualFreeEx(Process, Data, 0, MEM_RELEASE);
   end;
 finally
   CloseHandle(Process);
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
 NewColumn: TListColumn;
begin
 with ListView1 do
 begin
   ViewStyle := vsReport;
   NewColumn := Columns.Add;
   NewColumn.Caption := "WndHandle";
   NewColumn.Width := 100;
   NewColumn := Columns.Add;
   NewColumn.Caption := "WndText";
   NewColumn.Width := 250;
   NewColumn := Columns.Add;
   NewColumn.Caption := "ExeName";
   NewColumn.Width := 150;
   Align := alClient;
 end;
 FindTrayProcess(ListView1);
end;

end.


 
Adios   (2008-03-26 14:36) [7]

easy, спасибо! всё работает как надо.


 
DVM ©   (2008-03-26 14:55) [8]

Да и то место где иконки - это не трей :)



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

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

Наверх





Память: 0.48 MB
Время: 0.046 c
15-1204889416
Шмелъ
2008-03-07 14:30
2008.04.20
С наступающим....


15-1204619181
@!!ex
2008-03-04 11:26
2008.04.20
Windows XP 32 + AMD 64 глюк


15-1204749799
Triton5
2008-03-05 23:43
2008.04.20
Простая программа, которая делает скрины экрана...


15-1204541719
Kerk
2008-03-03 13:55
2008.04.20
Придумайте чего можно сделать на домене urlz.ru


2-1206555175
junkie
2008-03-26 21:12
2008.04.20
Excel процесс остается в памяти





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский