2010-08-14 2 views
2

Я создал экранную заставку (C#, .NET 4.0, если это имеет значение), но у меня есть пара проблем (на более косметическом уровне). Вероятно, их легко решить, но у меня есть prettu, который никогда не использовал API Win32, поэтому я могу легко пропустить очевидное, когда дело доходит до этого.. NET: владелец диалогового окна конфигурации экранной заставки и фокус предварительного просмотра

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 разбирается со 2-го аргумента команды. Проблема в том, что окно предварительного просмотра крадет фокус с вкладки настроек экранной заставки. Как наивная попытка, я позвонил SetFocus(hwndParent), но это не имело никакого эффекта. Что такое правильный способ держать фокус, где он должен быть

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

Application.Run(new ConfigurationForm());

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

ответ

0

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

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

Я исправил это, переместив вызов SetParent на ПОСЛЕ вызова, чтобы окно Window было дочерним. Посмотрите мой код в этом вопросе: Why won't the screen saver control panel kill my form when it dies?

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