C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

フォームを常に全面にし、操作だけは背面の画面に反映 /対中率 (18/04/11(Wed) 14:41) #87094
Re[1]: フォームを常に全面にし、操作だけは背面の画面に反映 /Hongliang (18/04/11(Wed) 17:00) #87099
Re[1]: フォームを常に全面にし、操作だけは背面の画面に反映 /魔界の仮面弁士 (18/04/11(Wed) 21:45) #87101
  └ Re[2]: フォームを常に全面にし、操作だけは背面の画面に反映 /対中率 (18/04/12(Thu) 01:27) #87109 解決済み


親記事 / ▼[ 87099 ] ▼[ 87101 ]
■87094 / 親階層)  フォームを常に全面にし、操作だけは背面の画面に反映
□投稿者/ 対中率 (1回)-(2018/04/11(Wed) 14:41:51)

分類:[C#] 

.NET Framework 4.6.1 C#

現在、デスクトップ画面上から指定した範囲内を連続キャプチャし、GIF画像を生成するソフトを作っています。
マウスのドラッグドロップで範囲指定し、1枚画像をキャプチャするところまでできたのですが、これを連続撮影するように改修しています。
撮影中は枠線のみ表示した透明なForm(撮影範囲がわかるように)を表示させた状態にしたいです。
そのため、フォームを最前面に配置したいのですが、最前面に配置してしまうとフォームの背面にある物に対して操作を受け付けなくなってしまいます。
フォームを最前面にしつつ、キーボードやマウス操作のみ背面に反映する方法はないでしょうか。
どなたか助言お願いします。

[ □ Tree ] 返信 編集キー/

▲[ 87094 ] / 返信無し
■87099 / 1階層)  Re[1]: フォームを常に全面にし、操作だけは背面の画面に反映
□投稿者/ Hongliang (632回)-(2018/04/11(Wed) 17:00:17)
Regionプロパティで、フォームの一部分だけを表示させるように指定できます。これを試してみてはいかがでしょうか。

1. フォーム全域のRegionを作る
2. ClientRectangleを取得してをボーダー分Offset
3. 1のRegionに2のRectangleをExclude
[ 親 87094 / □ Tree ] 返信 編集キー/

▲[ 87094 ] / ▼[ 87109 ]
■87101 / 1階層)  Re[1]: フォームを常に全面にし、操作だけは背面の画面に反映
□投稿者/ 魔界の仮面弁士 (1638回)-(2018/04/11(Wed) 21:45:15)
No87094 (対中率 さん) に返信
> フォームを最前面にしつつ、キーボードやマウス操作のみ背面に反映する方法はないでしょうか。

枠線部もマウス操作を受け付けない方が良いでしょうか?


private void button1_Click(object sender, EventArgs e)
{
 var fw = new FrameWindow();
 fw.SetBounds(50, 100, 350, 250);
 fw.Show(this);
}


private class FrameWindow : Form
{
 protected override CreateParams CreateParams
 {
  get
  {
   const int WS_EX_NOACTIVATE = 0x8000000; // アクティブにならないフォームにする
   const int WS_EX_TRANSPARENT = 0x20; // マウス操作を透過(要レイヤードウィンドウ)
   var cp = base.CreateParams;
   cp.ExStyle |= WS_EX_TRANSPARENT | WS_EX_NOACTIVATE;
   return cp;
  }
 }
 public FrameWindow()
 {
  ShowInTaskbar = false;
  TopMost = true;
  BackColor = Color.Blue; // 枠線色
  Padding = new Padding(9); // 枠線幅
  FormBorderStyle = FormBorderStyle.None;
  Controls.Add(new Control() { BackColor = Color.Magenta, Dock = DockStyle.Fill });

  // WS_EX_TRANSPARENT を有効にするには、
  // TransparencyKey をセットするか、もしくは
  // Opacity を 1.0 未満にする必要がある
  TransparencyKey = Color.Magenta;
 }
}
[ 親 87094 / □ Tree ] 返信 編集キー/

▲[ 87101 ] / 返信無し
■87109 / 2階層)  Re[2]: フォームを常に全面にし、操作だけは背面の画面に反映
□投稿者/ 対中率 (2回)-(2018/04/12(Thu) 01:27:04)
魔界の仮面弁士さんありがとうございます!
希望通りの動作を100%実現することができました!
助かりました



No87101 (魔界の仮面弁士 さん) に返信
> ■No87094 (対中率 さん) に返信
>>フォームを最前面にしつつ、キーボードやマウス操作のみ背面に反映する方法はないでしょうか。
>
> 枠線部もマウス操作を受け付けない方が良いでしょうか?
>
>
> private void button1_Click(object sender, EventArgs e)
> {
>  var fw = new FrameWindow();
>  fw.SetBounds(50, 100, 350, 250);
>  fw.Show(this);
> }
>
>
> private class FrameWindow : Form
> {
>  protected override CreateParams CreateParams
>  {
>   get
>   {
>    const int WS_EX_NOACTIVATE = 0x8000000; // アクティブにならないフォームにする
>    const int WS_EX_TRANSPARENT = 0x20; // マウス操作を透過(要レイヤードウィンドウ)
>    var cp = base.CreateParams;
>    cp.ExStyle |= WS_EX_TRANSPARENT | WS_EX_NOACTIVATE;
>    return cp;
>   }
>  }
>  public FrameWindow()
>  {
>   ShowInTaskbar = false;
>   TopMost = true;
>   BackColor = Color.Blue; // 枠線色
>   Padding = new Padding(9); // 枠線幅
>   FormBorderStyle = FormBorderStyle.None;
>   Controls.Add(new Control() { BackColor = Color.Magenta, Dock = DockStyle.Fill });
>
>   // WS_EX_TRANSPARENT を有効にするには、
>   // TransparencyKey をセットするか、もしくは
>   // Opacity を 1.0 未満にする必要がある
>   TransparencyKey = Color.Magenta;
>  }
> }
解決済み
[ 親 87094 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -