Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
То, когда Вы нажмете на Windows значка панели задач, отправит сообщение WM_ACTIVATE в Ваше приложение.
Вы уверены, что Ваш код передает сообщение WM_ACTIVATE оконной процедуре DefWindowProc для обработки?
Родительское окно диалогового окна установлено правильно?
После того, как я отправил это, я запустил свое собственное приложение Windows Forms и воспроизвел проблему, которую Вы описываете. У меня есть два диалоговых окна, каждый работает правильно другой, не делает и я не вижу, что любая непосредственная причина к тому, почему они ведут себя по-другому. Я обновлю это сообщение, если я узнаю.
Raymond Chen, где Вы!
Я знаю, что это сейчас очень старый, но я только что наткнулся на него и знаю ответ.
В приложениях, которые вы видели (и писали), где отображается диалоговое окно на передний план не выводило главное окно вместе с ним, разработчик просто не указывал владельца диалогового окна.
Это относится как к модальным окнам, так и к диалоговым окнам и окнам сообщений. , а также в немодальные окна. Установка владельца немодального всплывающего окна также всегда сохраняет всплывающее окно над своим владельцем.
В 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
), вместо того, чтобы сделать его окном, принадлежащим ему. Приведенный выше код - это правильный способ сделать существующее всплывающее окно своим окном.