Заставка C #: модальное диалоговое окно конфигурации для предоставленного HWND

Я работаю над комплектом заставки C # XNA, и до сих пор все на месте, за исключением диалогового окна конфигурации, которое должно быть модальным для диалогового окна Параметры экранной заставки, предоставляемого окнами ("/ c: ‹hwnd> "аргумент).

Мой тест - это встроенная в Vistas заставка 3D Text - мой код должен обеспечивать те же функции, и что касается диалогового окна конфигурации, 3D Text отображается полностью модально по отношению к Настройки экранной заставки < / em> и при нажатии на диалоговое окно Параметры экранной заставки диалоговые окна мигают, не принимая щелчок.

Я пробовал обернуть HWND с помощью IWin32Window, как было предложено Райаном Фарли, но даже несмотря на то, что мое диалоговое окно отображается поверх диалогового окна Настройки экранной заставки, элементы управления в диалоговом окне Настройки экранной заставки по-прежнему можно нажимать.

Итак, нужны ли мне какие-то экзотические вызовы Win32API, чтобы сообщить родительскому диалогу о том, что он был модализирован, или существует более чистое решение?


person Christian Madsen    schedule 01.01.2010    source источник


Ответы (3)


Попробуйте вызвать функцию API SetParent.

person SLaks    schedule 01.01.2010
comment
Я уже использую SetParent, но теперь обнаружил, что HWND, предоставляемый окнами для заставки, является дочерним элементом диалогового окна настроек, поэтому, вызывая GetParent на HWND, я получаю HWND, представляющий диалоговое окно. - person Christian Madsen; 01.01.2010
comment
Да. Мой диалог конфигурации является полностью модальным по отношению к диалогу настроек заставки Windows. - person Christian Madsen; 01.01.2010

Фактически, оказалось, что HWND, предоставляемый окнами для заставки, является дочерним элементом диалогового окна настроек, поэтому, вызывая GetParent в HWND, я получаю HWND, представляющий диалог.

Сегодня день, когда я написал свой первый вопрос на stackoverflow.com и ответил на первый вопрос.

person Christian Madsen    schedule 01.01.2010

У меня такая же проблема. Кроме того, я не мог напрямую привязать диалог к ​​внешнему окну с помощью .NET. Поэтому я предлагаю обходной путь, чтобы привязать диалог к ​​родительскому элементу данного дескриптора окна:

public class CHelpWindow : Form
{ // this class hooks to a foreign window handle and then it starts a
  // modal dialog to this form; .NET seems not to be able to hook a dialog 
  // to a foreign window handle directly: therefore this solution

  // retrieves the parent window of the passed child
  [DllImport("user32.dll")]
  private static extern IntPtr GetParent (IntPtr hWndChild);

  // changes the parent window of the passed child
  [DllImport("user32.dll")]
  private static extern IntPtr SetParent
    (IntPtr hWndChild, IntPtr hWndNewParent);

  // --------------------------------------------------------------------
  public CHelpWindow (long liHandle)
  // this constructor initializes this form and hooks this form to the parent
  // of the passed window handle; then it prepares the call to create the
  // dialog after this form window is first shown in the screen.
  {
    // removing the system title of the window
    FormBorderStyle = FormBorderStyle.None;
    // the dialog will be created when this form is first shown
    Shown += new EventHandler (HelpWindow_Shown);

    // hooking to the parent of the passed handle: that is the control, not
    // the tab of the screen saver dialog
    IntPtr oParent = GetParent (new IntPtr (liHandle));
    SetParent (Handle, oParent);
  }

  // --------------------------------------------------------------------
  private void HelpWindow_Shown (object oSender, EventArgs oEventArgs)
  // this function is called when the form is first shown; now is the right
  // time to start our configuration dialog
  {
    // positioning this window outside the parent area
    Location   = new Point (-100, -100);
    // reducing the size
    Size       = new Size (1, 1);
    ClientSize = new Size (1, 1);
    // creating the dialog
    CKonfiguration oConfiguration = new CKonfiguration ();
    // starting this dialog with the owner of this object; because this
    // form is hooked to the screen saver dialog, the startet dialog is
    // then indirectly hooked to that dialog
    oConfiguration.ShowDialog (this);
    // we don not need this object any longer
    Close ();
  }
}

После извлечения вашего дескриптора из командной строки

/c:####

вы создаете свой диалог

CHelpWindow oHelpWindow = new CHelpWindow (liHandle);
oHelpWindow.ShowDialog ();

Реймер

person Reimer    schedule 27.08.2013