2

別のアプリケーションのウィンドウの上にオーバーレイとして機能する C# フォームを使用してプログラムを作成しています。フォーム全体はほぼ透明な PictureBox であり、領域全体に広がり、あちこちに図形を描画します。

現在、オーバーレイが完全に透明な下のウィンドウとしか対話できません。不透明な領域がマウス イベントをインターセプトしないようにするにはどうすればよいですか?

わかりやすくするために、スクリーンショットを次に示します。
ここに画像の説明を入力

Skype は基盤となるアプリケーションです。私のオーバーレイは、青色 (および灰色) のボックスを描画します。ボックスの下にあるリンクをクリックできるようにする必要があります。

残念ながら、プログラムのどの部分が実際にこのような処理を行っているのかがわからないため、表示するコードはありません。

ありがとう。

4

1 に答える 1

-1

形状のクリック イベントをサブスクライブしてから、いくつかの Windows API を介して「オーバーレイされた」ウィンドウにイベントを転送することができます。アプリケーションのメイン ウィンドウへのポインターがある場合 (Process オブジェクトを介して自分で開始したか、別の方法で取得したかのいずれか)、マウス イベントをそのウィンドウに送信するだけです。

画面の現在のポイントを取得し、それを Skype の最初のインスタンスに送信する例を次に示します。

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

[StructLayout(LayoutKind.Explicit)]
struct LParamLocation
{
    [FieldOffset(0)]
    int Number;

    [FieldOffset(0)]
    public short X;

    [FieldOffset(2)]
    public short Y;

    public static implicit operator int(LParamLocation p)
    {
        return p.Number;
    }
}

private void Form1_MouseClick(object sender, MouseEventArgs e)
{
    var process = Process.GetProcessesByName("skype");
    LParamLocation points = new LParamLocation();
    points.X = (short)PointToScreen(e.Location).X;
    points.Y = (short)PointToScreen(e.Location).Y;

    SendMessage(process[0].MainWindowHandle, 0x201, 0, points); //MouseLeft down message
    SendMessage(process[0].MainWindowHandle, 0x202, 0, points); //MouseLeft up message
}

または、ウィンドウ スタイルを追加して、すべてのマウス イベントを通過するように指示することもできます。

[DllImport("user32.dll")]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll")]
static extern int GetWindowLong(IntPtr hWnd, int nIndex);

protected override void OnHandleCreated(EventArgs e)
{
    base.OnHandleCreated(e);
    int style = GetWindowLong(Handle, -20);
    style |= 0x00000020; // Enables Pass-Through of events
    style |= 0x00080000; // Enables Pass-Through to layered windows
    SetWindowLong(Handle, -20, style);
}
于 2013-01-21T01:39:33.087 に答える