.NET: Владелец диалогового окна настройки заставки и фокус предварительного просмотра. - PullRequest
2 голосов
/ 15 августа 2010

Я создал заставку (C #, .NET 4.0, если это имеет значение), но у меня есть пара проблем (хотя и на более косметическом уровне).Их, вероятно, легко решить, но я уже почти никогда не использовал Win32 API, поэтому я легко могу упустить очевидное, когда дело доходит до этого.

Q1: я настроил небольшое окно предварительного просмотра, например:

SetParent(Handle, hwndParent);
SetWindowLong(Handle, GWL_STYLE, new IntPtr(GetWindowLong(Handle, GWL_STYLE) | WS_CHILD));
Rectangle parentRect;
GetClientRect(hwndParent, out ParentRect);
Size = parentRect.Size;  

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

Q2: Если я открою диалоговое окно конфигурации «обычным способом» создания формы, то есть

Application.Run(new ConfigurationForm());

, диалоговое окно будетне быть модальным для апплета панели управления.Как этого достичь?Я понял, что HWND предполагаемого родителя предоставляется с аргументом команды как "/ c: nnnnnnnn", но это все, что я получил.(Использование SetParent(hwndParent) просто вело себя странно, так что это, очевидно, неправильная функция.)

1 Ответ

0 голосов
/ 25 августа 2014

Вы не проверяете возвращаемые значения в своих вызовах API ... Я знаю, что я также "позаимствовал" этот код из CodeProject, и он сломался в любой Windows, предшествующей XP.

Ваш вызов SetWindowsLongтерпит неудачу, потому что как только вы измените родительский элемент окна, у вас больше не будет доступа, чтобы изменить его.Если вы проверили возвращаемые значения и использовали GetLastError, вы увидите, что GetWindowLong и SetWindowLong завершаются с ошибкой = 5 (доступ запрещен).

Я исправил это, переместив вызов в SetParent, чтобы ПОСЛЕ вызова, чтобы сделать окно дочерним окном.См. Мой код в этом вопросе: Почему панель управления заставкой не уничтожит мою форму, когда она умрет?

Вы также скоро зададите вопрос, который я задавал там :-)

...