- 締切済み
C# タスクバーを隠したフォーム固定の方法
前略 ・C#の初心者です。 ・先日このMSN相談箱でtsukasa-12rさんからタスクバーを非表示する下記のプログラムをおしえていだきました。 このプログラムでウィンドウフォームを固定しようとして this.FormBorderStyle = FormBorderStyle.FixedSingle; のコードを1行だけ追加しましたがウィンドウフォームを固定できませんでした。 タスクバーを隠して かつウィンドウフォームを固定したいのですが tsukasa-12rさん以外の方でもかまいませんのでどなたか教えてください。 以上、よろしくお願いします //----------------------------------- using System; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { [DllImport("user32.dll", SetLastError = true)] static extern IntPtr FindWindow(string lpClassName, IntPtr lpWindowName); [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); private const int SW_HIDE = 0; private const int SW_NORMAL = 1; [StructLayout(LayoutKind.Sequential)] struct APPBARDATA { public int cbSize; public IntPtr hwnd; public uint uCallbackMessage; public uint uEdge; public Rectangle rc; public int lParam; }; private const int ABM_SETSTATE = 10; private const int ABS_AUTOHIDE = 1; private const int ABS_ALWAYSONTOP = 2; [DllImport("shell32.dll")] static extern int SHAppBarMessage(int msg, ref APPBARDATA pbd ); public Form1() { InitializeComponent(); // 「タスクバーを自動的に隠す」 APPBARDATA abd = new APPBARDATA(); abd.cbSize = Marshal.SizeOf(abd); abd.lParam = ABS_AUTOHIDE; SHAppBarMessage(ABM_SETSTATE, ref abd); // タスクバーを非表示 ShowWindow(FindWindow("Shell_TrayWnd", IntPtr.Zero), SW_HIDE); // コントロールボックスを非表示 this.ControlBox = false; // 最大表示 this.WindowState = FormWindowState.Maximized; this.FormBorderStyle = FormBorderStyle.FixedSingle;// ← ウィンドウサイズを固定しようとして追加 → 固定できず } private void button1_Click(object sender, EventArgs e) { // タスクバーを常に表示 APPBARDATA abd = new APPBARDATA(); abd.cbSize = Marshal.SizeOf(abd); abd.lParam = ABS_ALWAYSONTOP; SHAppBarMessage(ABM_SETSTATE, ref abd); // タスクバーを表示 ShowWindow(FindWindow("Shell_TrayWnd", IntPtr.Zero), SW_NORMAL); // フォームを閉じる this.Close(); } } }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- tsukasa-12r
- ベストアンサー率65% (358/549)
位置とサイズを固定できたとして、Alt + Tab でアプリケーションを切り替えたり、デスクトップに切り替えてそこからアプリケーションを起動できたりするのは構わないのですか? 「要求仕様」という言葉は仕事で使うのは別に問題ないと思いますが、こういった場では少し感じが悪いように思います。(受け取り方によっては、回答してくれる人に対して「こういう仕様で作りなさい」という要求を突きつけているように取れてしまう。)
- tsukasa-12r
- ベストアンサー率65% (358/549)
とりあえず、 private const int WM_NCLBUTTONDBLCLK = 0x00A3; protected override void WndProc(ref Message m) { switch (m.Msg) { case WM_NCLBUTTONDBLCLK: break; default: base.WndProc(ref m); break; } } を追加すると、ウィンドウタイトルをダブルクリックしても元のサイズに戻らなくなります。 しかし、Windows7 のエアロスナップが有効の場合、ウィンドウタイトルをドラッグすると元のサイズに戻ってしまいます。 レジストリの HKEY_CURRENT_USER\Control Panel\Desktop\DockMoving では再起動、もしくはログオフしなければ設定の変更がシステムに反映されませんが、コントロールパネルでは再起動、ログオフせずに反映できているので、何か方法があるのかもしれません。
お礼
前略 ・返答ありがとうございます。返答大変うれしく思っております。 ・コード追加して、ウィンドウタイトルをダブルクリックしても元のサイズに戻らなくなることを確認しました。ありがとうございます。でもウィンドウタイトルをドラッグして移動できてしまいます。移動できないようにしたいのです。 私の要求仕様が明確でなかったようです。もう一度整理して箇条書きにしたいとおもいます。 <要求仕様> 下記のウィンドウフォームをC#でつくりたい。 (1) タスクバーを表示しない。 (2) タイトルバーは表示する。 (3) ウィンドウフォームは最大化され、モニター画面内を移動できないこと。 <目的> パソコンの拡張スロットの拡張ボード( A/D、D/Aボード)をつかったソフトを作成中です。 作成中のソフトが動作中(アクチュエータ動作中)は他のアプリケーションソフトを起動できないようにしたいので上記のウィンドウフォームつくろうとしています。 尚、this.FormBorderStyle = FormBorderStyle.None;を追加するとタイトルバーが消えて<目的>は達成できるのですが メニューバー等を追加した時見栄えがよくないのでタイトルバーを追加したいと思っている次第です。 <質問> メニューバー付ウィンドウフォームが最大化され、モニター画面を移動できないようにする方法を教えてください。 以上、よろしくお願いします