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

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

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

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

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

textual
Листинг программы
  1. /// <summary>
  2.     /// Отображает эту форму в виде модального диалогового окна с указанным владельцем.
  3.     /// </summary>
  4.     ///
  5.     /// <returns>
  6.     /// Одно из значений <see cref="T:System.Windows.Forms.DialogResult"/>.
  7.     /// </returns>
  8.     /// <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>
  9.     public DialogResult ShowDialog(IWin32Window owner)
  10.     {
  11.       if (owner == this)
  12.         throw new ArgumentException(SR.GetString("OwnsSelfOrOwner", new object[1]
  13.         {
  14.           (object) "showDialog"
  15.         }), "owner");
  16.       if (this.Visible)
  17.         throw new InvalidOperationException(SR.GetString("ShowDialogOnVisible", new object[1]
  18.         {
  19.           (object) "showDialog"
  20.         }));
  21.       if (!this.Enabled)
  22.         throw new InvalidOperationException(SR.GetString("ShowDialogOnDisabled", new object[1]
  23.         {
  24.           (object) "showDialog"
  25.         }));
  26.       if (!this.TopLevel)
  27.         throw new InvalidOperationException(SR.GetString("ShowDialogOnNonTopLevel", new object[1]
  28.         {
  29.           (object) "showDialog"
  30.         }));
  31.       if (this.Modal)
  32.         throw new InvalidOperationException(SR.GetString("ShowDialogOnModal", new object[1]
  33.         {
  34.           (object) "showDialog"
  35.         }));
  36.       if (!SystemInformation.UserInteractive)
  37.         throw new InvalidOperationException(SR.GetString("CantShowModalOnNonInteractive"));
  38.       if (owner != null && ((int) UnsafeNativeMethods.GetWindowLong(new HandleRef((object) owner, Control.GetSafeHandle(owner)), -20) & 8) == 0 && owner is Control)
  39.         owner = (IWin32Window) ((Control) owner).TopLevelControlInternal;
  40.       this.CalledOnLoad = false;
  41.       this.CalledMakeVisible = false;
  42.       this.CloseReason = CloseReason.None;
  43.       IntPtr capture = UnsafeNativeMethods.GetCapture();
  44.       if (capture != IntPtr.Zero)
  45.       {
  46.         UnsafeNativeMethods.SendMessage(new HandleRef((object) null, capture), 31, IntPtr.Zero, IntPtr.Zero);
  47.         SafeNativeMethods.ReleaseCapture();
  48.       }
  49.       IntPtr handle1 = UnsafeNativeMethods.GetActiveWindow();
  50.       IntPtr handle2 = owner == null ? handle1 : Control.GetSafeHandle(owner);
  51.       IntPtr num = IntPtr.Zero;
  52.       this.Properties.SetObject(Form.PropDialogOwner, (object) owner);
  53.       Form ownerInternal = this.OwnerInternal;
  54.       if (owner is Form)
  55.       {
  56.         if (owner != ownerInternal)
  57.           this.Owner = (Form) owner;
  58.       }
  59.       try
  60.       {
  61.         this.SetState(32, true);
  62.         this.dialogResult = DialogResult.None;
  63.         this.CreateControl();
  64.         if (handle2 != IntPtr.Zero)
  65.         {
  66.           if (handle2 != this.Handle)
  67.           {
  68.             if (UnsafeNativeMethods.GetWindowLong(new HandleRef((object) owner, handle2), -8) == this.Handle)
  69.               throw new ArgumentException(SR.GetString("OwnsSelfOrOwner", new object[1]
  70.               {
  71.                 (object) "showDialog"
  72.               }), "owner");
  73.             UnsafeNativeMethods.GetWindowLong(new HandleRef((object) this, this.Handle), -8);
  74.             UnsafeNativeMethods.SetWindowLong(new HandleRef((object) this, this.Handle), -8, new HandleRef((object) owner, handle2));
  75.           }
  76.         }
  77.         try
  78.         {
  79.           if (this.dialogResult == DialogResult.None)
  80.             Application.RunDialog(this);
  81.         }
  82.         finally
  83.         {
  84.           if (!UnsafeNativeMethods.IsWindow(new HandleRef((object) null, handle1)))
  85.             handle1 = handle2;
  86.           if (UnsafeNativeMethods.IsWindow(new HandleRef((object) null, handle1)) && SafeNativeMethods.IsWindowVisible(new HandleRef((object) null, handle1)))
  87.             UnsafeNativeMethods.SetActiveWindow(new HandleRef((object) null, handle1));
  88.           else if (UnsafeNativeMethods.IsWindow(new HandleRef((object) null, handle2)) && SafeNativeMethods.IsWindowVisible(new HandleRef((object) null, handle2)))
  89.             UnsafeNativeMethods.SetActiveWindow(new HandleRef((object) null, handle2));
  90.           this.SetVisibleCore(false);
  91.           if (this.IsHandleCreated)
  92.           {
  93.             if (this.OwnerInternal != null && this.OwnerInternal.IsMdiContainer)
  94.             {
  95.               this.OwnerInternal.Invalidate(true);
  96.               this.OwnerInternal.Update();
  97.             }
  98.             this.DestroyHandle();
  99.           }
  100.           this.SetState(32, false);
  101.         }
  102.       }
  103.       finally
  104.       {
  105.         this.Owner = ownerInternal;
  106.         this.Properties.SetObject(Form.PropDialogOwner, (object) null);
  107.       }
  108.       return this.DialogResult;
  109.     }

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


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

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

10   голосов , оценка 4.1 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы