使用SetWindowLong()并且WS_EX_NOACTIVATE我已经使一个窗口不可激活。
我做了一个迷你项目来重现该问题:http://s000.tinyupload.com/index.php? file_id=78888532457762447347
基本上是一个具有两个窗口的 WPF 应用程序:
主窗口
// XAML code
<Window x:Class="CS_test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Background="LightGray" Height="300" Width="400">
<Grid>
<TextBox Width="300" Height="200"></TextBox>
</Grid>
</Window>
// C# code
namespace CS_test
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
new NonActiveWindow().Show();
}
}
}
Run Code Online (Sandbox Code Playgroud)
非活动窗口
// XAML code
<Window x:Class="CS_test.NonActiveWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="NonActiveWindow" Height="300" Width="300"
Loaded="Window_Loaded">
<Grid>
</Grid>
</Window>
// C# code
namespace CS_test
{
public partial class NonActiveWindow : Window
{
[DllImport("user32.dll")]
public static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll")]
public static extern int GetWindowLong(IntPtr hWnd, int nIndex);
private const int GWL_EXSTYLE = -20;
private const int WS_EX_NOACTIVATE = 0x08000000;
public NonActiveWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
WindowInteropHelper windowHelper = new WindowInteropHelper(this);
SetWindowLong(windowHelper.Handle, GWL_EXSTYLE, GetWindowLong(windowHelper.Handle, GWL_EXSTYLE) | WS_EX_NOACTIVATE);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道可以通过NonActiveWindow在单独的线程中实例化(使用单独的调度程序)来解决问题,但由于线程问题,我无法使用这种方法。
有没有一种方法可以防止焦点丢失,而无需在单独的线程中创建不可激活的窗口?
编辑:
显示问题的视频(回应贾斯汀的回答):
https://www.youtube.com/watch?v=6RNmJc7ya48
以防万一有人想知道为什么拖动时窗口没有更新:使用 WS_EX_NOACTIVATE 标志创建一个窗口,但在释放鼠标之前无法拖动它。
该ShowActivated属性对我来说运行良好:
public MainWindow()
{
InitializeComponent();
var otherWindow = new NonActiveWindow()
{
ShowActivated = false
};
otherWindow.Show();
}
Run Code Online (Sandbox Code Playgroud)
我的OtherWindow只是一个空的 WPF 窗口,没有您的示例中的任何 P/Invoke 调用。
请注意,在显示之后MainWindow稍微显示 ,因为此调用位于构造函数中。如果你想解决这个问题,那么你应该在构造函数之外调用,例如在事件中。 OtherWindowShowLoaded
| 归档时间: |
|
| 查看次数: |
1528 次 |
| 最近记录: |