2013-04-07 8 views
7

フローティングサイドバーで 'ペン'ボタンをトグルした後、マウスで画面に描画するための小さなツールを作っています。透明なWindowsフォームでのマウスクリックの防止

透明キーが画面全体を覆うように、背景が一番上のウィンドウフォームを持つことでこれを行っています(笑ってください)。 。 私はこの次のマウスは私が「描画モードでmは、私がしようとしたとき、以下のようなものの上にフォームをクリックしないようにする必要があり:成功したマウスを停止 Windows form with a transparent background that cannot be clicked through How to disable click through on transparent control?

だけでなく、フォームを、国連最大化し、 (HTCAPTION IntPtr(2)これを使用して)私はMSDNに記載されている他のいくつかの値を使ってみましたが、運がありません。

私は、 (初心者フレンドがお願いします!)

PS私はこれを今使っています。

 //code for allowing clicking through of menus 
     protected override void WndProc(ref Message m) 
     {    
      if (penMode && m.Msg == 0x84) 
      { 
       m.Result = new IntPtr(2);  
      } 
      else 
       base.WndProc(ref m); 
     } 

UPDATE:問題を完全に別の方法で解決しました。 WndProcが動作するようには見えないので、画面全体に空白のフォームを作成しただけで、その中からメインフォーム(form.Show(this))が示されました。次に、空白のフォームの不透明度を0%〜1%の範囲で調整して、クリックスルーを許可/防止します。作品! すべての回答のおかげで、多くのことを教えてくれました。

答えて

5

実際、これを正しい方法で実行しているように、私は笑っている必要はありません。あなたはデスクトップを所有していないので、デスクトップに直接描画するべきではありません。代わりに、あなたはdo自分が持っている透明なフォームを重ね合わせてシミュレートする必要があります。透明なオーバーレイフォームを所有しているため、それを描画することは問題ありません。

しかし、それ以外にも、実際に何が実際に行われているかをはっきりと理解していないと、ランダムに値を試しているように思えます。それはあなたの目を閉じてダーツを投げるようなものです。非常に高いヒット数はありません。

まず、コードが何をしているかを理解しましょう。マジックの値0x84は、WM_NCHITTESTメッセージに対応しています。このメッセージは、ウィンドウがマウスのクリックをどのように処理するかを決定するためにウィンドウによって送信されます。このメッセージに応答して、リンクされたドキュメントに記載されているHT*のいずれかの値で返信します。これらの値のそれぞれは、特定の意味を持ちます。例えば:(2の値を有する)

  • HTCAPTIONウィンドウのクリック部分はウィンドウのキャプション/タイトルバーとして扱われるべきであることを意味します。 Windowsを使用することから、タイトルバーを使用してウィンドウを画面上でドラッグすることができることがわかっているので、マウスクリックに応じてHTCAPTIONを返すと、ウィンドウをドラッグ可能にすることができます。これはボーダーレスフォーム(タイトルバーのないフォーム)で使用され、移動可能になります。

  • HTTRANSPARENT(値は-1です)は、もう1つの値です。これはかなり簡単です。それはあなたのウィンドウを透明に見せかけるだけです。それは、「私に気をつけない、ここには窓がない」というようなものです。マウスクリックは、あなたがそこにいないかのように、Zオーダーのあなたの下にあるウィンドウに単に渡されます。

  • HTCLIENT(値は1)は、クリックがウィンドウのクライアント領域のどこかで発生した場合のデフォルトの結果です。すべてを正常に動作させるには、これを返す(または単にデフォルトのウィンドウプロシージャを呼び出す)でしょう。この値を返すクリックイベントは、フォームのClickイベントを発生させるか、フォームにある子コントロールに渡すことで、フレームワークによって正常に処理されます。

あなたがない描画しているときに、あなたはおそらくHTTRANSPARENTを返すようにしたいです。 の場合、HTCLIENTを返して、描画コードがマウスイベントを表示して結果を描画できるようにします。

そして、あなたのコードを修正:あなたはわずか5%程度を好きで、非アクティブに透明キーを残すためにあなたのウィンドウの可視性を設定することをお勧めします

// Code for allowing clicking through of the form 
protected override void WndProc(ref Message m) 
{ 
    const uint WM_NCHITTEST = 0x84; 

    const int HTTRANSPARENT = -1; 
    const int HTCLIENT  = 1; 
    const int HTCAPTION  = 2; 
    // ... or define an enum with all the values 

    if (m.Msg == WM_NCHITTEST) 
    { 
     // If it's the message we want, handle it. 
     if (penMode) 
     { 
      // If we're drawing, we want to see mouse events like normal. 
      m.Result = new IntPtr(HTCLIENT); 
     } 
     else 
     { 
      // Otherwise, we want to pass mouse events on to the desktop, 
      // as if we were not even here. 
      m.Result = new IntPtr(HTTRANSPARENT); 
     } 
     return; // bail out because we've handled the message 
    } 

    // Otherwise, call the base class implementation for default processing. 
    base.WndProc(ref m); 
} 
+1

を助けたときに、ウィンドウの透明部分は、親ウィンドウにメッセージを送信しません。マウスをクリックします。 (メッセージとSpy ++のログ記録で確認されます)。 –

+0

@Cody、うわー、そんなにクリアで完全な答えがありがとう!それはいいようですが、私が今見ているのは、ポイントを描いた後、そのポイントをもう一度クリックすると、透明ではなく青色になります。 –

+0

Windows 10では動作しませんジョンが言及したのと同じ理由。 –

1

あなたは基本的に、それはありますジェットを気付くことはありません:D

希望を、これはWindows 8のマシンでのテスト

+0

@Chronosありがとうございますが、ボタンやもっと重要なのはペンモードで描画するものが5%表示されていない場所です。 –

+1

私はこの問題を過小評価すると思います。私は今、3つのフォームを使用してソリューションを持っています。透明キーのおかげでほとんど目に見えないGUIが表示されます。 2番目は5%の可視性で入力を制御するだけです。もう1つは透過キーを使用して再び描画されます。 Sry私は早くこれを考えなかった。今度は、ファイルとそのすべてが含まれている.rarファイルがテストされています。https://drive.google.com/folderview?id=0B-5Qr5swDDp8ZV9CMUVrVHloeWc&usp=sharing – ChronosMOT

+0

ありがとう、私は以来、 2つのフォーム - UIと同じものを描画しますが、まだすべてのターゲットマシンで完全にテストすることができなかったため、ソリューションを更新しませんでした。私は他の誰と同じ行に沿って考えているのを見てうれしい! –

関連する問題