2010-12-28 12 views
5

私はデスクトップ上の領域をラビングすることができるスクリーンキャプチャユーティリティを持っています。私はこれを非常に簡単なやり方でやっていますが、デスクトップのスクリーンショットをグレースケールに変換したスクリーンと同じサイズのフォームがあります。ユーザーがマウスの左ボタンを押したままにすると、フォーム上の領域を選択できます。ユーザーが描画する矩形はTransparentColorで埋められます。ユーザがマウスを持ち上げると、透過矩形がそのまま残り、実際のデスクトップが見えます。ここに私の問題が来る: 私のdevのPCで私は実際にこの透明な四角形をクリックして周りをナビゲートすることができます。私の他のPCではフォームは実際の透明な四角形上でマウスクリックで応答します。透明なフォーム上のデスクトップへのクリックスルー

私はC#で.NET 4.0を使用していますが、どのようにして実際にすべてのケースでデスクトップをクリックすることができますか?

はありがとうと多くは感謝:)私はこれに非常に深く見た後、この問題の適切な解決策を見つけることができた

答えて

7

。適切な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に設定します。そうでなければ、透明になります。

このコードビットが役立ち、人々がそれを使用することを望みます。

+0

Timerを使用する代わりに、フォームの各コントロールのOnMouseEnter/OnMouseDownイベントを利用しないでください。 – Jason

+6

定数に欠損値を追加してください。 –

+0

以下は便利なリンクです: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

関連する問題