非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

C# Formを常に最背面にしておくには

      2016/06/11

[ad#top-1]
 
前回のブログでバーチャルデスクトップについて構想をお伝えしましたが、どうしても必要な機能として、常に最背面にあって、常に最大化しておくということです。最背面を維持しないと起動中のアプリ画面が背面に回って見えなくなってしまうし、最大化が崩れると画面全体を覆っている意味がなくなってしまいます。

最大化で一番の難関が、タスクバーにある「デスクトップボタン」です。これを押すとすべてのアプリケーションが最小化するようになっていて、この指令を無視できるようにしなければなりません。

出来上がりはこんな感じ、以前のブログ、

これは使えそう!フォーム上に付箋紙みたいな自由に移動できるパネル
http://non-it-salaryman.blogspot.jp/2015/11/c_20.html

で作ったものに機能を追加していくようにしました。最背面にするにはWindowsAPIを扱う必要があるようです。下が実行例。

コードはこんな感じ。

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

class Test{
static void Main(){
Application.Run(new FormMain());
}
}

public class FormMain : Form{
private Panel pane;
private Label label;

const int WM_SYSCOMMAND = 0x0112;
const int SC_MOVE = 0xF010;
const int SC_SIZE = 0xF000;

//最背面にするためのAPI
[DllImport(“USER32.DLL”, CharSet=CharSet.Auto)]
private static extern System.IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport(“USER32.DLL”, CharSet=CharSet.Auto)]
private static extern System.IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

[DllImport(“User32.dll”, EntryPoint = “SendMessage”)]
extern static int SendMessageGetTextLength(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
[DllImport(“User32.dll”)]
public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);
[DllImport(“User32.dll”)]
public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, int lParam);
[DllImport(“User32.dll”)]
public static extern bool SetCapture(IntPtr hWnd);
[DllImport(“user32.dll”)]
public static extern bool ReleaseCapture();

public FormMain(){
this.StartPosition = FormStartPosition.CenterScreen;
this.Width = Screen.PrimaryScreen.Bounds.Width;
this.Height = Screen.PrimaryScreen.Bounds.Height;
this.Text = “Test”;
this.WindowState = FormWindowState.Maximized;
this.DoubleClick += new EventHandler(FormDoubleClicked);
this.FormBorderStyle = FormBorderStyle.None;
this.ShowInTaskbar = false;

pane = new Panel(){
Size = new Size(200, 150),
BackColor = Color.Blue,
Location = new Point(10, 10),
Parent = this,
};
pane.MouseDown += new MouseEventHandler(this.Panel_MouseDown);

label = new Label(){
Dock = DockStyle.Fill,
BackColor = Color.LightPink,
BorderStyle = BorderStyle.FixedSingle,
Parent=pane,
};
label.MouseDown += new MouseEventHandler(this.Panel_MouseDown);

System.IntPtr hProgramManagerHandle = FindWindow(null, “Program Manager”);

// 正しく取得できた場合は、Program Manager を親ウィンドウに設定する
if (! hProgramManagerHandle.Equals(System.IntPtr.Zero)) {
SetParent(this.Handle, hProgramManagerHandle);
}
}

private void Panel_MouseDown(object sender, MouseEventArgs e){
SetCapture(pane.Handle);
ReleaseCapture();
SendMessage(pane.Handle, WM_SYSCOMMAND, SC_MOVE | 2, 0);
}

private void FormDoubleClicked(object sender, EventArgs e){
Application.Exit();
}
}

 
[ad#ad-1]

スポンサーリンク

 - C#応用編