【发布时间】:2015-09-21 05:02:01
【问题描述】:
我正在开发 Windows 上的 c# 控制台程序来移动窗口,作为其中的一部分,我试图在目标目的地创建一个透明框,以便让用户直观地确认新位置。我目前面临两个主要问题:
- 我想将表单放置在屏幕坐标中
- 我希望能够在用户确认他们的决定后关闭窗口。
目前,我的控制台客户端正在调用的库中有执行此操作的代码:
public static void CreateBox(Rect rectangle)
{
Form f = new Form();
f.Name = BoxName;
f.BackColor = Color.Blue;
f.FormBorderStyle = FormBorderStyle.None;
f.Bounds = new System.Drawing.Rectangle(rectangle.Left, rectangle.Top, rectangle.Right - rectangle.Left, rectangle.Bottom - rectangle.Top);
f.TopMost = true;
f.Opacity = 0.5;
Application.EnableVisualStyles();
Task.Run(() => Application.Run(f));
}
在这里搜索了一些问题后,我想出了这个尝试稍后关闭表单:
public static void RemoveBox()
{
Form f = Application.OpenForms[BoxName];
if (f != null)
{
f.Close();
}
}
这是抛出一个异常,因为它来自不同的线程,我如何关闭这个窗口,以及如何将它放置在屏幕坐标中它应该去的确切位置?
编辑:
我现在正在使用它来尝试找到要移动/关闭它的框,但未成功:
public static void CreateBox(Rect rectangle)
{
Form f = new Form();
f.Name = BoxName;
f.BackColor = Color.AliceBlue;
f.FormBorderStyle = FormBorderStyle.None;
f.TopMost = true;
f.Opacity = 0.3;
Application.EnableVisualStyles();
Task.Run(() =>
{
Application.Run(f);
});
MoveBox(rectangle);
}
public static void RemoveBox()
{
IntPtr hWnd = FindBox(new TimeSpan(0, 0, 1));
var proc = Process.GetProcesses().Where(p => p.Handle == hWnd).Single();
if (proc == null)
{
return;
}
proc.Kill();
}
public static void MoveBox(Rect rect)
{
IntPtr hWnd = FindBox(new TimeSpan(0, 0, 1));
MoveWindow(hWnd, rect);
}
private static IntPtr FindBox(TimeSpan timeout)
{
DateTime time = DateTime.Now;
IntPtr hWnd = IntPtr.Zero;
while(DateTime.Now < time.Add(timeout) || hWnd != IntPtr.Zero)
{
hWnd = FindWindowByCaption(IntPtr.Zero, BoxName);
}
return hWnd;
}
这个问题:
我不能让 FindBox 调用花费很长时间,因为我的目标是让这个框出现并在用户拖动它们时将窗口捕捉到它们,并且需要在他们在桌面上移动时移动它。
RemoveBox 函数中的 p.Handle == hWnd 检查抛出和访问被拒绝异常。
【问题讨论】:
标签: c# winforms asynchronous