。適切なWin32 API呼び出しでは、マウスのクリックに対して「不可視」のフォームを設定することが可能です。これは、次のようにして実現できます。
[DllImport("user32.dll", SetLastError = true)]
static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll")]
static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags);
public void SetFormTransparent(IntPtr Handle) {
oldWindowLong = GetWindowLong(Handle, GWL_EXSTYLE);
SetWindowLong(Handle, GWL_EXSTYLE, Convert.ToInt32(oldWindowLong | WS_EX_LAYERED | WS_EX_TRANSPARENT));
}
public void SetFormNormal(IntPtr Handle) {
SetWindowLong(Handle, GWL_EXSTYLE, Convert.ToInt32(oldWindowLong | WS_EX_LAYERED));
}
しかし、すべてにトリックがあります。フォーラムで行われたすべてのクリックがフォームを通過し、フォームの下のものに送信されるように注意する必要があります。たとえば、フォームをクリックするとボタンをクリックしてボタンをクリックしたいのですが、私は簡単なトリックを行いました。私はバックグラウンドでNミリ秒ごとに実行するタイマーを持っており、カーソルの位置を分析しています。それが私がしたい領域の上にあれば、SetFormNormal()を介してFormをNormalに設定します。そうでなければ、透明になります。
このコードビットが役立ち、人々がそれを使用することを望みます。
Timerを使用する代わりに、フォームの各コントロールのOnMouseEnter/OnMouseDownイベントを利用しないでください。 – Jason
定数に欠損値を追加してください。 –
以下は便利なリンクです:http://stackoverflow.com/questions/1524035/topmost-form-clicking-through-possible、http://pinvoke.net/default.aspx/Constants.GWL%20-%20GetWindowLong、 http://pinvoke.net/default.aspx/Constants.Window%20styles – Xantix