Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2008, 15:03   #1
King Nothing
 
Регистрация: 18.06.2008
Сообщений: 7
Стрелка EnumWindows внури объекта

При переносе вызова процедуры получения указателей на запущенные приложения в объект (см. ниже) в вызываемую функцию вместо указателей почему-то попадает 0.
Подскажите пожалуйста в чем проблема?


Вызов внутри объекта
Код:
Constructor TAppList.Create;
Begin
  Inherited Create;

  Try
    // Создать список ссылок на окна
    FPAppList := THWind.Create;

    // Запускаем формирование перечня всех главных окон приложений
    EnumWindows(@TAppList.EnumWindowsWnd, 0);

   Except
    FPAppList.Free;

  End;
End;

// Эта функция вызывается, когда найдено главное окно
Function TAppList.EnumWindowsWnd(H: HWnd) : Bool; StdCall;
Begin
  ShowMessage(IntToStr(H));

  If H <> 0 Then Begin// Проверка наличия окна
    Result := True ;
   End
  Else
    Result := False ;
End ;
Вызов в основном модуле программы
Код:
// Эта функция вызывается, когда найдено главное окно
Function EnumWindowsWnd(H: HWnd) : Bool; StdCall;
Begin
  ShowMessage(IntToStr(H));

  If H <> 0 Then Begin// Проверка наличия окна
    Result := True ;
   End
  Else
    Result := False ;
End ;

...
EnumWindows(@EnumWindowsWnd, 0);
King Nothing вне форума Ответить с цитированием
Старый 20.06.2008, 15:26   #2
hoza_syl
Форумчанин
 
Аватар для hoza_syl
 
Регистрация: 23.05.2008
Сообщений: 219
По умолчанию

Для перебора всех дочерних окон некого окна используй
EnumChildWindows.
The Revolution is Now!
hoza_syl вне форума Ответить с цитированием
Старый 20.06.2008, 15:32   #3
King Nothing
 
Регистрация: 18.06.2008
Сообщений: 7
Печаль

Мне не нужны дочерние, мне нужен перечень главных.

Вариант в основном тексте программы выдает то, что мне нужно.

Для порядка решил засунуть все в объект, при этом функция вызывается, количество вызовов такое же как и при работе в основном модуле программы.
Но при этом какая-то проблема с передачей параметра, передается "0".
King Nothing вне форума Ответить с цитированием
Старый 20.06.2008, 15:46   #4
hoza_syl
Форумчанин
 
Аватар для hoza_syl
 
Регистрация: 23.05.2008
Сообщений: 219
По умолчанию

Попробуй обявить процедуру EnumWindowsWnd(H: HWnd) : Bool; StdCall;
не методом TAppList а отдельно.
The Revolution is Now!
hoza_syl вне форума Ответить с цитированием
Старый 20.06.2008, 15:53   #5
King Nothing
 
Регистрация: 18.06.2008
Сообщений: 7
Восклицание

Да так все работает, но повторяю:
хочется все иметь упакованным в объект
King Nothing вне форума Ответить с цитированием
Старый 20.06.2008, 16:03   #6
hoza_syl
Форумчанин
 
Аватар для hoza_syl
 
Регистрация: 23.05.2008
Сообщений: 219
По умолчанию

Мне кажется что так не получется поскольку процедуры обратного вызова не могут быть методами каких либо обэктов.
Максимум можно упаковать все в отдельный модуль.
Обяви в нем свой обэкт и процедуру EnumWindowsWnd. При создании обэкта указывай адрес этой процедуры.

Подключай модуль и свободно используй обэкт.
The Revolution is Now!
hoza_syl вне форума Ответить с цитированием
Старый 20.06.2008, 16:29   #7
King Nothing
 
Регистрация: 18.06.2008
Сообщений: 7
Восклицание

Дело в том, что при вызове функция результат должна сохранять в поле объекта.
При работе снаружи это сделать сложно.

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

Написать без объекта я могу, но хочется чтобы было все красиво.
Поэтому подожду, может кто опытный поможет.
King Nothing вне форума Ответить с цитированием
Старый 20.06.2008, 19:22   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

King Nothing, объявляйте EnumWindowsWnd как статический метод и передавайте в EnumWindows указатель self вторым параметром. Потом в EnumWindowsWnd будете его (lParam) кастать к своему типу. Это самый простой способ, есть и другие, но пользоваться лучше указанным. И зачем обижать тех, кто старается помочь?

Последний раз редактировалось B_N; 22.06.2008 в 03:32.
B_N вне форума Ответить с цитированием
Старый 20.06.2008, 19:41   #9
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от B_N Посмотреть сообщение
King Nothing, объявляйте EnumWindowsWnd как статический метод и передавайте в EnumWindows указатель self вторым параметром. Потом в EnumWindowsWnd будете его (lParam) кастать к своему типу. Это самый простой способ, есть и другие, но пользоваться лучше указанным. И зачем обижать тех, кто старается помочь?

BOBAH13, это больше похоже на флуд...
Вы совершенно не правы... если у людей даже не появилось желание посмотреть внимательно что я предложил... то уж извените И объясните мне зачем объяснять то, что написано в документации...

короче
Код:
var
  Wnd: HWND;
begin
  Wnd := GetWindow(Self.Handle, GW_HWNDFIRST);
  while (Wnd <> 0) do
  begin
    // получили новый Wnd - хендл окна
    Wnd := GetWindow(Self.Handle, GW_HWNDNEXT);   
  end;
ПОЛНАЯ АНАЛОГИЯ ФУНКЦИИ EnumWindows

MSDN:
Цитата:
GetWindow Function

--------------------------------------------------------------------------------

The GetWindow function retrieves a handle to a window that has the specified relationship (Z-Order or owner) to the specified window.

Syntax

HWND GetWindow( HWND hWnd,
UINT uCmd
);
Parameters

hWnd
[in] Handle to a window. The window handle retrieved is relative to this window, based on the value of the uCmd parameter.
uCmd
[in] Specifies the relationship between the specified window and the window whose handle is to be retrieved. This parameter can be one of the following values.
GW_CHILD
The retrieved handle identifies the child window at the top of the Z order, if the specified window is a parent window; otherwise, the retrieved handle is NULL. The function examines only child windows of the specified window. It does not examine descendant windows.
GW_ENABLEDPOPUP
Windows 2000/XP: The retrieved handle identifies the enabled popup window owned by the specified window (the search uses the first such window found using GW_HWNDNEXT); otherwise, if there are no enabled popup windows, the retrieved handle is that of the specified window.
GW_HWNDFIRST
The retrieved handle identifies the window of the same type that is highest in the Z order. If the specified window is a topmost window, the handle identifies the topmost window that is highest in the Z order. If the specified window is a top-level window, the handle identifies the top-level window that is highest in the Z order. If the specified window is a child window, the handle identifies the sibling window that is highest in the Z order.
GW_HWNDLAST
The retrieved handle identifies the window of the same type that is lowest in the Z order. If the specified window is a topmost window, the handle identifies the topmost window that is lowest in the Z order. If the specified window is a top-level window, the handle identifies the top-level window that is lowest in the Z order. If the specified window is a child window, the handle identifies the sibling window that is lowest in the Z order.
GW_HWNDNEXT
The retrieved handle identifies the window below the specified window in the Z order. If the specified window is a topmost window, the handle identifies the topmost window below the specified window. If the specified window is a top-level window, the handle identifies the top-level window below the specified window. If the specified window is a child window, the handle identifies the sibling window below the specified window.
GW_HWNDPREV
The retrieved handle identifies the window above the specified window in the Z order. If the specified window is a topmost window, the handle identifies the topmost window above the specified window. If the specified window is a top-level window, the handle identifies the top-level window above the specified window. If the specified window is a child window, the handle identifies the sibling window above the specified window.
GW_OWNER
The retrieved handle identifies the specified window's owner window, if any. For more information, see Owned Windows.
Return Value

If the function succeeds, the return value is a window handle. If no window exists with the specified relationship to the specified window, the return value is NULL. To get extended error information, call GetLastError.

Последний раз редактировалось B_N; 22.06.2008 в 03:35.
BOBAH13 вне форума Ответить с цитированием
Старый 22.06.2008, 20:30   #10
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

получение списка окон без EnumWindows:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  Wnd: HWND;
  str:array[0..255] of char;
begin
  Wnd := GetWindow(Handle, GW_HWNDFIRST);
  while (Wnd <> 0) do
  begin
   GetWindowText(wnd,@str,254);
   if IsWindowVisible(wnd) then ListBox1.Items.Add(str);
   Wnd := GetWindow(wnd, GW_HWNDNEXT);
  end;
end;
rpy3uH вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определение цвета объекта Tan4ik Помощь студентам 4 16.06.2008 15:53
Движение объекта по кругу Roberto Помощь студентам 2 06.05.2008 15:44
Динамическое создание объекта Fruit Общие вопросы Delphi 5 24.01.2008 11:00
Динамическое создание объекта Fruit Общие вопросы Delphi 2 16.01.2008 21:18
Свойства объекта KBak Win Api 5 15.08.2007 20:21