いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

フォームを常に最前面に表示させる (タスクマネージャー, SetWindowPos, user32.dll, TopMost)


通常フォームを最前面に持ってくるにはTopMostプロパティを利用します。
ですが、以下のWin-APIを利用しても同じ事が実現出来ます。

SetWindowPos関数


引数などの指定は以下を参照してください。


別にこの関数を利用しなくてもTopMostで同じ事が出来るので
いらないのではと思ったりしますが、SetWindowPos関数は
引数にいろいろ指定できるので、結構便利だったりします。
普段利用する事はないですが、知っておくと役に立つかもしれませんね。


具体的には以下のような事ができます。

  • Zオーダーの位置を細かく指定できる
  • ウィンドウのサイズを指定できる
  • ウィンドウの位置を指定できる


以下、サンプルです。

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace SetWindowPosSample
{
    public partial class Form1 : Form
    {
        static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);

        const uint SWP_NOSIZE = 0x0001;
        const uint SWP_NOMOVE = 0x0002;

        // (x, y), (cx, cy)を無視するようにする.
        const uint TOPMOST_FLAGS = (SWP_NOSIZE | SWP_NOMOVE);

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint flags);

        public Form1()
        {
            InitializeComponent();
        }

        private void btnTopMost_Click(object sender, EventArgs e)
        {
            Form newForm = new Form{ TopMost = true };
            newForm.Show();
        }

        private void btnSetWindowPos_Click(object sender, EventArgs e)
        {
            Form newForm = new Form();

            newForm.Load += (s2, e2) =>
                {
                    SetWindowPos(newForm.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);
                };

            newForm.Show();
        }
    }
}


================================
過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。