我正在使用以下代码:
protected override void OnSourceInitialized(EventArgs e)
{
...
....
HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
...
...
}
在某些系统中,“source”值为null,我无法找到原因......
答案 0 :(得分:7)
我认为您可能需要等到呈现UI,直到您尝试分配Hwnd。尝试将其放在Window.Loaded的事件处理程序中。
之前我遇到过这种情况,在代码隐藏的构造函数中调用了InitializeComponent()之后我得到了Hwnd赋值。它总是回来null,当我走过去看到用户界面尚未出现时,这可能会感觉到。我将它弹出到_Loaded处理程序中,然后在点击该行之前UI呈现,所有突然的'this'都停止为null。
答案 1 :(得分:6)
从.Net 4.0开始,您无需先显示窗口即可访问HwndSource
:
var helper = new WindowInteropHelper(this);
var hwndSource = HwndSource.FromHwnd(helper.EnsureHandle());
答案 2 :(得分:4)
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();
}