Приведение IntPtr к Window (управляемому типу) - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Подскажите, пожалуйста, как привести имеющийся указатель на объект известного типа к этому типу? Я делаю небольшой аддон к Компасу и, судя по документации, надо передать родительское окно моему вспомогательному окну. У меня есть указатель IntPtr на основное окно программы. Как мне получить тип из указателя? нужно что-то вроде этого:
public MyWindow(KompasObject kompas)
{
    this.Parent = (Window)new IntPtr(kompas.GetHWindow());
}

Решение задачи: «Приведение IntPtr к Window (управляемому типу)»

textual
Листинг программы
/// <summary>
    /// Отображает эту форму в виде модального диалогового окна с указанным владельцем.
    /// </summary>
    /// 
    /// <returns>
    /// Одно из значений <see cref="T:System.Windows.Forms.DialogResult"/>.
    /// </returns>
    /// <param name="owner">Любой объект, реализующий <see cref="T:System.Windows.Forms.IWin32Window"/>, которое представляет окно верхнего уровня — будущего собственника модального диалогового окна.</param><exception cref="T:System.ArgumentException">Форма, указанная в параметре <paramref name="owner"/>, совпадает с отображаемой формой.</exception><exception cref="T:System.InvalidOperationException">Отображаемая форма уже отображена. -или-  Отображаемая форма отключена. -или-  Отображаемая форма не является окном верхнего уровня. -или-  Отображаемая в виде диалогового окна форма уже является модальной формой. -или- Текущий процесс не выполняется в интерактивном пользовательском режиме (дополнительные сведения см. в описании свойства <see cref="P:System.Windows.Forms.SystemInformation.UserInteractive"/>).</exception><filterpriority>1</filterpriority><PermissionSet><IPermission class="System.Security.Permissions.EnvironmentPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/><IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/><IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="UnmanagedCode, ControlEvidence"/><IPermission class="System.Security.Permissions.UIPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/><IPermission class="System.Diagnostics.PerformanceCounterPermission, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/></PermissionSet>
    public DialogResult ShowDialog(IWin32Window owner)
    {
      if (owner == this)
        throw new ArgumentException(SR.GetString("OwnsSelfOrOwner", new object[1]
        {
          (object) "showDialog"
        }), "owner");
      if (this.Visible)
        throw new InvalidOperationException(SR.GetString("ShowDialogOnVisible", new object[1]
        {
          (object) "showDialog"
        }));
      if (!this.Enabled)
        throw new InvalidOperationException(SR.GetString("ShowDialogOnDisabled", new object[1]
        {
          (object) "showDialog"
        }));
      if (!this.TopLevel)
        throw new InvalidOperationException(SR.GetString("ShowDialogOnNonTopLevel", new object[1]
        {
          (object) "showDialog"
        }));
      if (this.Modal)
        throw new InvalidOperationException(SR.GetString("ShowDialogOnModal", new object[1]
        {
          (object) "showDialog"
        }));
      if (!SystemInformation.UserInteractive)
        throw new InvalidOperationException(SR.GetString("CantShowModalOnNonInteractive"));
      if (owner != null && ((int) UnsafeNativeMethods.GetWindowLong(new HandleRef((object) owner, Control.GetSafeHandle(owner)), -20) & 8) == 0 && owner is Control)
        owner = (IWin32Window) ((Control) owner).TopLevelControlInternal;
      this.CalledOnLoad = false;
      this.CalledMakeVisible = false;
      this.CloseReason = CloseReason.None;
      IntPtr capture = UnsafeNativeMethods.GetCapture();
      if (capture != IntPtr.Zero)
      {
        UnsafeNativeMethods.SendMessage(new HandleRef((object) null, capture), 31, IntPtr.Zero, IntPtr.Zero);
        SafeNativeMethods.ReleaseCapture();
      }
      IntPtr handle1 = UnsafeNativeMethods.GetActiveWindow();
      IntPtr handle2 = owner == null ? handle1 : Control.GetSafeHandle(owner);
      IntPtr num = IntPtr.Zero;
      this.Properties.SetObject(Form.PropDialogOwner, (object) owner);
      Form ownerInternal = this.OwnerInternal;
      if (owner is Form)
      {
        if (owner != ownerInternal)
          this.Owner = (Form) owner;
      }
      try
      {
        this.SetState(32, true);
        this.dialogResult = DialogResult.None;
        this.CreateControl();
        if (handle2 != IntPtr.Zero)
        {
          if (handle2 != this.Handle)
          {
            if (UnsafeNativeMethods.GetWindowLong(new HandleRef((object) owner, handle2), -8) == this.Handle)
              throw new ArgumentException(SR.GetString("OwnsSelfOrOwner", new object[1]
              {
                (object) "showDialog"
              }), "owner");
            UnsafeNativeMethods.GetWindowLong(new HandleRef((object) this, this.Handle), -8);
            UnsafeNativeMethods.SetWindowLong(new HandleRef((object) this, this.Handle), -8, new HandleRef((object) owner, handle2));
          }
        }
        try
        {
          if (this.dialogResult == DialogResult.None)
            Application.RunDialog(this);
        }
        finally
        {
          if (!UnsafeNativeMethods.IsWindow(new HandleRef((object) null, handle1)))
            handle1 = handle2;
          if (UnsafeNativeMethods.IsWindow(new HandleRef((object) null, handle1)) && SafeNativeMethods.IsWindowVisible(new HandleRef((object) null, handle1)))
            UnsafeNativeMethods.SetActiveWindow(new HandleRef((object) null, handle1));
          else if (UnsafeNativeMethods.IsWindow(new HandleRef((object) null, handle2)) && SafeNativeMethods.IsWindowVisible(new HandleRef((object) null, handle2)))
            UnsafeNativeMethods.SetActiveWindow(new HandleRef((object) null, handle2));
          this.SetVisibleCore(false);
          if (this.IsHandleCreated)
          {
            if (this.OwnerInternal != null && this.OwnerInternal.IsMdiContainer)
            {
              this.OwnerInternal.Invalidate(true);
              this.OwnerInternal.Update();
            }
            this.DestroyHandle();
          }
          this.SetState(32, false);
        }
      }
      finally
      {
        this.Owner = ownerInternal;
        this.Properties.SetObject(Form.PropDialogOwner, (object) null);
      }
      return this.DialogResult;
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5
Похожие ответы