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

Тема в разделе "Delphi - FAQ", создана пользователем Vadik(R), 5 июл 2011.

  1. Vadik(R)

    Vadik(R) Well-Known Member

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

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Элементарно Ватсон :ya_lamo:
    Читаем мануал!
     
  3. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Перепробовал сейчас все константы для функции GetAncestor, но она так и не вернула значение, равное Application.Handle.
    Но из того, что ты написал, я только одно понял, что GetParent возвращает именно родителя, то есть, окно должно именно "родиться" чтоль :ya_lamo: А вот видимо Application для Form1 видимо какой-то левый родитель. Хотя и есть участок кода:
    Код (Delphi):
    Application.CreateForm(TForm1, Form1);
     
  4. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    :) Ох... Не любим Мануалы читать?...
    Ну и правильно... F1 - это не так информативно как метод научного тыка... :)
    Код (Delphi):
     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++ такой фичи нет.
     
Загрузка...

Поделиться этой страницей