【发布时间】:2014-12-04 08:51:20
【问题描述】:
好的,以下问题:
我在一台 PC 上的多达 10 个屏幕上有一些窗口。其中一些应该在后台任务中运行。它是一个 WPF 应用程序,但对于屏幕定位等,我使用了 WinForms 的某些部分。为此,我使用以下几行:
foreach (List<string> myStrings in Screen.AllScreens.Select(myScreen => _xml.GetScreenConfigs(i)))
{
Thread newWindowThread = new Thread(() =>
{
Marketing myMarketing = new Marketing(i, myStrings[0]);
myMarketing.Show();
Dispatcher.Run();
});
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.IsBackground = true;
newWindowThread.Start();
}
在这个窗口中,我使用以下内容来定位它:
[DllImport("user32.dll")]
private static extern IntPtr GetActiveWindow();
...
Left = Convert.ToInt32(screenArray[screenNumber].Bounds.Left);
Top = Convert.ToInt32(screenArray[screenNumber].Bounds.Top);
var active = GetActiveWindow();
var singleOrDefault = Application.Current.Windows.OfType<Window>()
.SingleOrDefault(window => new WindowInteropHelper(window).Handle == active);
if (singleOrDefault == null) return;
singleOrDefault.Title = "Monitor" + screenNumber;
singleOrDefault.Name = "Monitor" + screenNumber;
singleOrDefault.WindowState = WindowState.Maximized;
但是当我到达“var singleOrDefault”行时,我收到一条错误消息,指出它无法更改对象 Application.Current.Windows,因为它由另一个线程拥有。 所以我的问题如下:
“我能做什么,在不同的线程中使用这个窗口并定位和最大化它?”
【问题讨论】:
-
您确定需要多个 UI 线程吗?为什么不使用单个 UI 线程来显示后台操作的结果?
-
是的,因为有一个 WebBrowser 控件运行多次,当我将它与 flash 一起使用时(而且我必须使用 flash,没有办法绕过它),在 3 个控件之后应用程序关闭当所有人都在同一个线程上运行时,它会跪下。
-
正如我测试的那样,集合(Application.Current.Windows)只记录主线程上的窗口,您无法从中获取非主线程窗口。您是否试图从大量窗口中找到活动窗口并将其最大化?
-
这正是我尝试过的。
标签: c# wpf multithreading winforms wpf-controls