Отличие функций Getwindowlong и Getparent

  • Автор темы Автор темы Vadik(R)
  • Дата начала Дата начала
V

Vadik(R)

Люди, столкнулся с довольно частой проблемой повторного запуска приложения. Проблему повторного запуска решил, потом решил сделать так, чтобы окно уже запущенного приложения стало активным. Далее, набил шишку, что нельзя свернуть "найденное окно". Проблему тоже решил тем, что ShowWindow применяю не к форме, а к Application. Но вот, собственно, вопрос: почему если написать:
Код:
GetParent(Form1.Handle);
То функция возвратит 0, якобы родителя нет, а если вызвать функцию GetWindowLong с параметром GWL_HWNDPARENT:
Код:
GetWindowLong(Form1.Handle, GWL_HWNDPARENT);
То функция возвратит не ноль, а действительно родителя формы?
Чем отличаются вызовы этих функций? Потому что, сколько не искал в интернете их описания, для обоих написано (если вторую вызывать с соответствующим параметром), что они возвращают хэндл родителя. Так почему же тогда я могу получить родителя Form1 только написав:
Код:
GetWindowLong(Form1.Handle, GWL_HWNDPARENT);
А написав:
Код:
GetParent(Form1.Handle);
Я получаю ноль? В целом, хоть моя проблема с повторным запуском и решена, мне теперь просто стало интересно.
 
Так почему же тогда я могу получить родителя Form1 только написав:
Код:
GetWindowLong(Form1.Handle, GWL_HWNDPARENT);
А написав:
Код:
GetParent(Form1.Handle);
Я получаю ноль? В целом, хоть моя проблемы и решена с повторным запуском, мне теперь просто стало интересно.
Элементарно Ватсон :ya_lamo:
Читаем мануал!
Функция GetParent

Функция GetParent извлекает дескриптор родителя или владельца заданного окна.

Чтобы извлечь дескриптор заданного предка, используйте функцию GetAncestor.

Синтаксис
HWND GetParent(
HWND hWnd
);

Параметры

hWnd [in] Дескриптор окна, дескриптор родительского окна которого должен быть найден.

Возвращаемые значения

Если окно - дочернее окно, величина возвращаемого значения - дескриптор родительского окна. Если окно - окно верхнего уровня, величина возвращаемого значения - дескриптор окну владельца. Если окно - не имеющее владельца окно верхнего уровня или если функция завершается с ошибкой, величина возвращаемого значения - ПУСТО (NULL). Чтобы получать расширенные данные об ошибках, вызовите функцию GetLastError. К примеру, это прояснило бы, когда функция возвращает значение ПУСТО (NULL), то ли функция завершилась ошибкой, то ли окно была окном верхнего уровня.

Замечания

Обратите внимание!, что, несмотря на свое имя, эта функция может возвращать окно владельца вместо родительского окна. Чтобы получить дескриптор родительского окна, а не окна владельца, используйте функцию GetAncestor с флажком GA_PARENT.
 
Перепробовал сейчас все константы для функции GetAncestor, но она так и не вернула значение, равное Application.Handle.
Но из того, что ты написал, я только одно понял, что GetParent возвращает именно родителя, то есть, окно должно именно "родиться" чтоль :ya_lamo: А вот видимо Application для Form1 видимо какой-то левый родитель. Хотя и есть участок кода:
Код:
Application.CreateForm(TForm1, Form1);
 
Перепробовал сейчас все константы для функции GetAncestor, но она так и не вернула значение, равное Application.Handle.
Но из того, что ты написал, я только одно понял, что GetParent возвращает именно родителя, то есть, окно должно именно "родиться" чтоль ;) А вот видимо Application для Form1 видимо какой-то левый родитель. Хотя и есть участок кода:
Код:
Application.CreateForm(TForm1, Form1);
:) Ох... Не любим Мануалы читать?...
Ну и правильно... F1 - это не так информативно как метод научного тыка... :)
Код:
 if Application.Handle <> Application.MainForm.Handle then
Beep;
if Application.MainForm.ParentWindow <> Application.Handle then
Beep;
if Application.MainForm.Owner = Application then
Beep;
Application (TApplication) - это тоже окно, хотя и скрытое...
Окну Application во время выполнения программы можно посылать сообщения, и даже делать видимым... :)
Только у VCL приложений есть Application. У программ писаных на C++ такой фичи нет.
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab