2015-12-29 67 views
2

首先,我想定義我的意思是透明點擊在下面的文字:這意味着點擊通過我的窗口沒有任何處理,直接到無論哪個窗戶都在下面。我需要這種行爲,因爲這個應用程序是爲了覆蓋遊戲。製作一個WPF窗口點擊,但不是它的控件

我搜索了有關使窗口對點擊透明的問題。我想知道是否有一種方法可以使窗口本身對點擊透明,而不是其控件(如文本框和按鈕)。

下面是窗口標記:

<Window x:Class="QuestBrowser.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Quest Browser" 
     Height="350" Width="525" 
     AllowsTransparency="True" WindowStyle="None" Topmost="True"> 
    <Window.Background> 
     <SolidColorBrush Color="White" Opacity="0.1"/> 
    </Window.Background> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <TextBox Name="inputTxtBox"></TextBox> 
    </Grid> 
</Window> 

而且波紋管,使窗口透明的點擊(其它問題幾乎複製粘貼代碼,因爲我不擅長在所有低級別的Windows編程)。

namespace Win32Utils 
{ 
    public static class WindowHelper 
    { 
     const int WS_EX_TRANSPARENT = 0x00000020; 
     const int GWL_EXSTYLE = (-20); 

     public static void SetWindowExTransparent(IntPtr hwnd) 
     { 
      var extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE); 
      SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_TRANSPARENT); 
     } 
    } 
} 

方法WindowHelper.SetWindowExTransparent從我的方法Window.OnSourceInitialized(按照指示在帖子裏我從一個透明窗口中的代碼)的覆蓋範圍內稱爲:

protected override void OnSourceInitialized(EventArgs e) 
{ 
    base.OnSourceInitialized(e); 
    var hwnd = new WindowInteropHelper(this).Handle; 
    WindowHelper.SetWindowExTransparent(hwnd); 
} 

這確實使窗口對點擊透明,但我放入它的所有控件也是透明的(例如TextBox)。有沒有辦法使窗口表面透明點擊,但確保TextBox仍然能夠正常接收鼠標和鍵盤輸入?

我想避免出於用戶隱私原因的鼠標和鍵盤掛鉤,因爲,正如我所說,我不太瞭解Windows API。如果鉤子是唯一的方法,我會非常感激他們如何工作的「傻瓜式」解釋。

回答

3

你可以試試這個

<Window x:Class="WpfApplication1.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Window1" 
     Height="300" 
     Width="300" 
     AllowsTransparency="True" 
     WindowStyle="None" > 
    <Window.Background> 
     <SolidColorBrush Color="#FFB0B0B0" 
         Opacity="0.05" /> 
    </Window.Background> 
    <Grid> 
     <Button Content="Button" 
       HorizontalAlignment="Left" 
       Margin="39,125,0,0" 
       VerticalAlignment="Top" 
       Width="75" /> 
     <Label Content="Label" 
       HorizontalAlignment="Left" 
       Margin="114,50,0,0" 
       VerticalAlignment="Top" /> 
     <TextBox HorizontalAlignment="Left" 
       Height="23" 
       Margin="101,201,0,0" 
       TextWrapping="Wrap" 
       Text="TextBox" 
       VerticalAlignment="Top" 
       Width="120" /> 

    </Grid> 
</Window> 

它通常做的是建立一個透明的窗口。(點擊進入和Invisble)。但是控件是可見的,而不是通過點擊。 或者您可以嘗試How to create a semi transparent window in WPF that allows mouse events to pass through

+0

非常感謝!我所需要做的只是讓窗戶完全透明,而不像我所做的那樣只是部分透明。我不會想象窗口背景的顏色定義了它的行爲。 – FinnTheHuman

+0

如果它滿足您的疑問,請標記它的答案 – AEonAX

+0

我會盡快完成所有測試。再次感謝。 – FinnTheHuman

相關問題