2012-01-04 5 views
1

C#でWinFormsアプリケーションを開発しました。これは、ドロップダウンリストから選択してチェックボックスを切り替えることで、ウィンドウを「一番上に」できるようにします。ほとんどのウィンドウの左上にあるアイコン

しかし、そのアプリを開いているのはちょっとばかげているので、私の選択したプログラムを実行するWindowsの左上のアイコンにエントリを追加することが可能かどうか疑問に思っていましたか?

私はそのアイコン/スポットが何で呼ばれているのかわからないので、実験的なコードはありません。私はそれを研究することができません。

+1

このスクリーンショットは参考になる場合があります。 –

+0

表示されるメニューは、ウィンドウのシステムメニューであり、タイトルバーまたはタスクバーのウィンドウを右クリックすることによってもトリガーされます。 – Deanna

答えて

1

winformのこの領域は"Non client area"と呼ばれます。

しかし、最も簡単な解決策は、スイッチをすべての外部winformsに追加することで、アクティブなウィンドウフォームの左上にあるオン/オフスイッチで小さなフォームを配置するプロセスを作成することです。あなたはそれを直接外部フォームに置くことができますが、あなたはポジションの優先順位に問題があります。

質問に「WinApi」が含まれているので、現在実行中のプロセスのウィンドウハンドル、座標、および最上位プロパティを取得できると思います。

3

私はあなたがやりたいように見えます。このコードが見つかりました:私はそれhere

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

namespace WinFormsSystemMenuTest 
{ 
    public partial class Form1 : Form 
    { 
     #region Win32 API Stuff 

     // Define the Win32 API methods we are going to use 
     [DllImport("user32.dll")] 
     private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert); 

     [DllImport("user32.dll")] 
     private static extern bool InsertMenu(IntPtr hMenu, Int32 wPosition, Int32 wFlags, Int32 wIDNewItem, string lpNewItem); 

     /// Define our Constants we will use 
     public const Int32 WM_SYSCOMMAND = 0x112; 
     public const Int32 MF_SEPARATOR = 0x800; 
     public const Int32 MF_BYPOSITION = 0x400; 
     public const Int32 MF_STRING = 0x0; 

     #endregion 

     // The constants we'll use to identify our custom system menu items 
     public const Int32 _SettingsSysMenuID = 1000; 
     public const Int32 _AboutSysMenuID = 1001; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     protected override void OnHandleCreated(EventArgs e) 
     { 
      /// Get the Handle for the Forms System Menu 
      IntPtr systemMenuHandle = GetSystemMenu(this.Handle, false); 

      /// Create our new System Menu items just before the Close menu item 
      InsertMenu(systemMenuHandle, 5, MF_BYPOSITION | MF_SEPARATOR, 0, string.Empty); // <-- Add a menu seperator 
      InsertMenu(systemMenuHandle, 6, MF_BYPOSITION, _SettingsSysMenuID, "Settings..."); 
      InsertMenu(systemMenuHandle, 7, MF_BYPOSITION, _AboutSysMenuID, "About..."); 

      base.OnHandleCreated(e); 
     } 

     protected override void WndProc(ref Message m) 
     { 
      // Check if a System Command has been executed 
      if (m.Msg == WM_SYSCOMMAND) 
      { 
       // Execute the appropriate code for the System Menu item that was clicked 
       switch (m.WParam.ToInt32()) 
       { 
        case _SettingsSysMenuID: 
         MessageBox.Show("\"Settings\" was clicked"); 
         break; 
        case _AboutSysMenuID: 
         MessageBox.Show("\"About\" was clicked"); 
         break; 
       } 
      } 

      base.WndProc(ref m); 
     } 
    } 
} 

を。これはあなたが望んでいるようですね、はい?

+1

Loadイベントハンドラのコードは、OnHandleCreated()のオーバーライドに属します。 –

+0

@ Hansなぜそうですか? – CamronBute

+0

うわー、それは予想よりも簡単に見えます! 30分ほどでそれを試してみる。そのリンクから、私が望むものが正確に表示されます:) – f2lollpll

関連する問題