我正在使用以下代码:
protected override void OnSourceInitialized(EventArgs e)
{
...
....
HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
...
...
}
在某些系统中,“源”值是空的,我找不到原因......
我正在使用以下代码:
protected override void OnSourceInitialized(EventArgs e)
{
...
....
HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
...
...
}
在某些系统中,“源”值是空的,我找不到原因......
我认为您可能必须等到 UI 呈现,直到您尝试分配 Hwnd。尝试将其放入 Window.Loaded 的事件处理程序中。
这发生在我之前,在代码隐藏的构造函数中调用 InitializeComponent() 之后,我进行了 Hwnd 分配。它总是返回 null,这可能是当我通过并看到 UI 尚未出现时感觉到的。我将它弹出到 _Loaded 处理程序中,瞧,UI 在到达该行之前呈现,并且突然间“this”不再为空。
从 .Net 4.0 开始,您HwndSource
无需先显示窗口即可访问:
var helper = new WindowInteropHelper(this);
var hwndSource = HwndSource.FromHwnd(helper.EnsureHandle());
WumpasTamer 的回答是正确的。我只想为其他寻找“交钥匙”解决方案的人添加一个快速代码示例。如果您已经在使用 WPF,则window
没有必要,但如果您正在使用 Winforms 并想使用,则PresentationSource
需要使用它。
void Main()
{
var window = new Window
{
Width = 0,
Height = 0,
WindowStyle = WindowStyle.None,
ShowInTaskbar = false,
ShowActivated = false
};
window.Loaded += a_Loaded;
window.Show();
}
void a_Loaded(object sender, EventArgs e)
{
var s = (Window) sender;
var source = PresentationSource.FromVisual(s);
//...
s.Close();
}