Почему делает нажатие на дочернее окно не, всегда приносят приложение к переднему плану?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
5
задан tzot 6 October 2008 в 09:34
поделиться

3 ответа

То, когда Вы нажмете на Windows значка панели задач, отправит сообщение WM_ACTIVATE в Ваше приложение.

Вы уверены, что Ваш код передает сообщение WM_ACTIVATE оконной процедуре DefWindowProc для обработки?

1
ответ дан 14 December 2019 в 13:52
поделиться

Родительское окно диалогового окна установлено правильно?

После того, как я отправил это, я запустил свое собственное приложение Windows Forms и воспроизвел проблему, которую Вы описываете. У меня есть два диалоговых окна, каждый работает правильно другой, не делает и я не вижу, что любая непосредственная причина к тому, почему они ведут себя по-другому. Я обновлю это сообщение, если я узнаю.

Raymond Chen, где Вы!

0
ответ дан 14 December 2019 в 13:52
поделиться

Я знаю, что это сейчас очень старый, но я только что наткнулся на него и знаю ответ.

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

Это относится как к модальным окнам, так и к диалоговым окнам и окнам сообщений. , а также в немодальные окна. Установка владельца немодального всплывающего окна также всегда сохраняет всплывающее окно над своим владельцем.

В Win32 API функции для вызова диалогового окна или окна сообщения принимают окно владельца в качестве параметра:

INT_PTR DialogBox(
    HINSTANCE hInstance,
    LPCTSTR lpTemplate,
    HWND hWndParent,      /* this is the owner */
    DLGPROC lpDialogFunc
);

int MessageBox(
    HWND hWnd,            /* this is the owner */
    LPCTSTR lpText,
    LPCTSTR lpCaption,
    UINT uType
);

Аналогично , в .NET WinForms можно указать владельца:

public DialogResult ShowDialog(
    IWin32Window owner
)

public static DialogResult Show(
    IWin32Window owner,
    string text
) /* ...and other overloads that include this first parameter */

Кроме того, в WinForms легко установить владельца немодального окна:

public void Show(
    IWin32Window owner,
)

или, что то же самое:

form.Owner = this;
form.Show();

В прямом коде WinAPI владелец немодального окна может быть установлен при создании окна:

HWND CreateWindow(
    LPCTSTR lpClassName,
    LPCTSTR lpWindowName,
    DWORD dwStyle,
    int x,
    int y,
    int nWidth,
    int nHeight,
    HWND hWndParent, /* this is the owner if dwStyle does not contain WS_CHILD */
    HMENU hMenu,
    HINSTANCE hInstance,
    LPVOID lpParam
);

или впоследствии:

SetWindowLong(hWndPopup, GWL_HWNDPARENT, (LONG)hWndOwner);

или (64-битная совместимость)

SetWindowLongPtr(hWndPopup, GWLP_HWNDPARENT, (LONG_PTR)hWndOwner);

Обратите внимание, что MSDN может сказать следующее about SetWindowLong [Ptr] :

Не вызывайте SetWindowLongPtr с индексом GWLP_HWNDPARENT для изменения родителя дочернего окна. Вместо этого используйте функцию SetParent .

Это несколько вводит в заблуждение, поскольку, похоже, подразумевает, что последние два приведенных выше фрагмента неверны. Это не так. Вызов SetParent превратит предполагаемое всплывающее окно в дочерний родительского окна (установив его бит WS_CHILD ), вместо того, чтобы сделать его окном, принадлежащим ему. Приведенный выше код - это правильный способ сделать существующее всплывающее окно своим окном.

владелец немодального окна может быть установлен при создании окна:

HWND CreateWindow(
    LPCTSTR lpClassName,
    LPCTSTR lpWindowName,
    DWORD dwStyle,
    int x,
    int y,
    int nWidth,
    int nHeight,
    HWND hWndParent, /* this is the owner if dwStyle does not contain WS_CHILD */
    HMENU hMenu,
    HINSTANCE hInstance,
    LPVOID lpParam
);

или позже:

SetWindowLong(hWndPopup, GWL_HWNDPARENT, (LONG)hWndOwner);

или (64-битная совместимость)

SetWindowLongPtr(hWndPopup, GWLP_HWNDPARENT, (LONG_PTR)hWndOwner);

Обратите внимание, что MSDN может сказать следующее о SetWindowLong [Ptr] :

Не вызывайте SetWindowLongPtr с индексом GWLP_HWNDPARENT для изменения родителя дочернего окна. Вместо этого используйте функцию SetParent .

Это несколько вводит в заблуждение, поскольку, кажется, подразумевает, что последние два приведенных выше фрагмента неверны. Это не так. Вызов SetParent превратит предполагаемое всплывающее окно в дочерний родительского окна (установив его бит WS_CHILD ), вместо того, чтобы сделать его окном, принадлежащим ему. Приведенный выше код - это правильный способ сделать существующее всплывающее окно своим окном.

владелец немодального окна может быть установлен при создании окна:

HWND CreateWindow(
    LPCTSTR lpClassName,
    LPCTSTR lpWindowName,
    DWORD dwStyle,
    int x,
    int y,
    int nWidth,
    int nHeight,
    HWND hWndParent, /* this is the owner if dwStyle does not contain WS_CHILD */
    HMENU hMenu,
    HINSTANCE hInstance,
    LPVOID lpParam
);

или позже:

SetWindowLong(hWndPopup, GWL_HWNDPARENT, (LONG)hWndOwner);

или (64-битная совместимость)

SetWindowLongPtr(hWndPopup, GWLP_HWNDPARENT, (LONG_PTR)hWndOwner);

Обратите внимание, что MSDN может сказать следующее о SetWindowLong [Ptr] :

Не вызывайте SetWindowLongPtr с индексом GWLP_HWNDPARENT для изменения родителя дочернего окна. Вместо этого используйте функцию SetParent .

Это несколько вводит в заблуждение, поскольку, кажется, подразумевает, что последние два приведенных выше фрагмента неверны. Это не так. Вызов SetParent превратит предполагаемое всплывающее окно в дочерний родительского окна (установив его бит WS_CHILD ), вместо того, чтобы сделать его окном, принадлежащим ему. Приведенный выше код - это правильный способ сделать существующее всплывающее окно своим окном.

HWND CreateWindow(
    LPCTSTR lpClassName,
    LPCTSTR lpWindowName,
    DWORD dwStyle,
    int x,
    int y,
    int nWidth,
    int nHeight,
    HWND hWndParent, /* this is the owner if dwStyle does not contain WS_CHILD */
    HMENU hMenu,
    HINSTANCE hInstance,
    LPVOID lpParam
);

или позже:

SetWindowLong(hWndPopup, GWL_HWNDPARENT, (LONG)hWndOwner);

или (64-разрядная совместимость)

SetWindowLongPtr(hWndPopup, GWLP_HWNDPARENT, (LONG_PTR)hWndOwner);

Обратите внимание, что MSDN может сказать следующее о SetWindowLong [Ptr] :

Не вызывать SetWindowLongPtr с индексом GWLP_HWNDPARENT для изменения родителя дочернего окна. Вместо этого используйте функцию SetParent .

Это несколько вводит в заблуждение, поскольку, кажется, подразумевает, что последние два приведенных выше фрагмента неверны. Это не так. Вызов SetParent превратит предполагаемое всплывающее окно в дочерний родительского окна (установив его бит WS_CHILD ), вместо того, чтобы сделать его окном, принадлежащим ему. Приведенный выше код - это правильный способ сделать существующее всплывающее окно своим окном.

HWND CreateWindow(
    LPCTSTR lpClassName,
    LPCTSTR lpWindowName,
    DWORD dwStyle,
    int x,
    int y,
    int nWidth,
    int nHeight,
    HWND hWndParent, /* this is the owner if dwStyle does not contain WS_CHILD */
    HMENU hMenu,
    HINSTANCE hInstance,
    LPVOID lpParam
);

или позже:

SetWindowLong(hWndPopup, GWL_HWNDPARENT, (LONG)hWndOwner);

или (64-разрядная совместимость)

SetWindowLongPtr(hWndPopup, GWLP_HWNDPARENT, (LONG_PTR)hWndOwner);

Обратите внимание, что MSDN может сказать следующее о SetWindowLong [Ptr] :

Не вызывать SetWindowLongPtr с индексом GWLP_HWNDPARENT для изменения родителя дочернего окна. Вместо этого используйте функцию SetParent .

Это несколько вводит в заблуждение, поскольку, похоже, подразумевает, что последние два приведенных выше фрагмента неверны. Это не так. Вызов SetParent превратит предполагаемое всплывающее окно в дочерний родительского окна (установив его бит WS_CHILD ), вместо того, чтобы сделать его окном, принадлежащим ему. Приведенный выше код - это правильный способ сделать существующее всплывающее окно своим окном.

Не вызывайте SetWindowLongPtr с индексом GWLP_HWNDPARENT для изменения родителя дочернего окна. Вместо этого используйте функцию SetParent .

Это несколько вводит в заблуждение, поскольку, кажется, подразумевает, что последние два приведенных выше фрагмента неверны. Это не так. Вызов SetParent превратит предполагаемое всплывающее окно в дочерний родительского окна (установив его бит WS_CHILD ), вместо того, чтобы сделать его окном, принадлежащим ему. Приведенный выше код - это правильный способ сделать существующее всплывающее окно своим окном.

Не вызывайте SetWindowLongPtr с индексом GWLP_HWNDPARENT для изменения родителя дочернего окна. Вместо этого используйте функцию SetParent .

Это несколько вводит в заблуждение, поскольку, похоже, подразумевает, что последние два приведенных выше фрагмента неверны. Это не так. Вызов SetParent превратит предполагаемое всплывающее окно в дочерний родительского окна (установив его бит WS_CHILD ), вместо того, чтобы сделать его окном, принадлежащим ему. Приведенный выше код - это правильный способ сделать существующее всплывающее окно своим окном.

Это не так. Вызов SetParent превратит предполагаемое всплывающее окно в дочерний родительского окна (установив его бит WS_CHILD ), вместо того, чтобы сделать его окном, принадлежащим ему. Приведенный выше код - это правильный способ сделать существующее всплывающее окно своим окном.

Это не так. Вызов SetParent превратит предполагаемое всплывающее окно в дочерний родительского окна (установив его бит WS_CHILD ), вместо того, чтобы сделать его окном, принадлежащим ему. Приведенный выше код - это правильный способ сделать существующее всплывающее окно своим окном.

5
ответ дан 14 December 2019 в 13:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: