Как получить дескриптор самой верхней формы в приложении WinForm?

Что касается почтовых индексов, это типичный британский почтовый индекс:

EC2R 6PK

В университете мой лектор по базам данных сказал мне кое-что, что застряло со мной и все еще имеет место 15+ лет спустя:

Если вы выполняете арифметику, сохраняйте ее как число. В противном случае это строка.

Честно говоря, я не думаю, что вы можете ошибиться с этим советом.

Очевидно, что вы не выполняете арифметику для почтовых индексов, поэтому они являются строками.

8
задан tzup 16 June 2009 в 11:49
поделиться

3 ответа

Вот один из способов получить верхнюю форму, использующую Win32 (не очень элегантно, но работает):

public const int GW_HWNDNEXT = 2; // The next window is below the specified window
public const int GW_HWNDPREV = 3; // The previous window is above

[DllImport("user32.dll")]
static extern IntPtr GetTopWindow(IntPtr hWnd);

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool IsWindowVisible(IntPtr hWnd);

[DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "GetWindow", SetLastError = true)]
public static extern IntPtr GetNextWindow(IntPtr hwnd, [MarshalAs(UnmanagedType.U4)] int wFlag);

/// <summary>
/// Searches for the topmost visible form of your app in all the forms opened in the current Windows session.
/// </summary>
/// <param name="hWnd_mainFrm">Handle of the main form</param>
/// <returns>The Form that is currently TopMost, or null</returns>
public static Form GetTopMostWindow(IntPtr hWnd_mainFrm)
{
    Form frm = null;

    IntPtr hwnd = GetTopWindow((IntPtr)null);
    if (hwnd != IntPtr.Zero)
    {
        while ((!IsWindowVisible(hwnd) || frm == null) && hwnd != hWnd_mainFrm)
        {
            // Get next window under the current handler
            hwnd = GetNextWindow(hwnd, GW_HWNDNEXT);

            try
            {
                frm = (Form)Form.FromHandle(hwnd);
            }
            catch
            {
                // Weird behaviour: In some cases, trying to cast to a Form a handle of an object 
                // that isn't a form will just return null. In other cases, will throw an exception.
            }
        }
    }

    return frm;
}
7
ответ дан 5 December 2019 в 11:26
поделиться

Вы можете реализовать одноэлементный шаблон в самой верхней форме и предоставить статическое свойство, которое возвращает один экземпляр самого себя и просто закрывает его.

   public class MainForm : Form
   {
      private static MainForm mainForm;

      public static MainForm { get { return mainForm; } }

      public MainForm()
      {
         mainForm = this;
      }
   }


   // When the ESC key is pressed...
   MainForm.MainForm.Close();
1
ответ дан 5 December 2019 в 11:26
поделиться

FormCollection используется объектом Application для перечисления текущих открытых форм в приложении через свойство OpenForms

См. http: // msdn.microsoft.com/en-us/library/system.windows.forms.application.openforms.aspx

Затем вы можете проверить свойство TopMost () каждой формы. А когда вы находите самую верхнюю форму, вы ее закрываете.

1
ответ дан 5 December 2019 в 11:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: