如何找到活动的子窗口(如在模式对话框中的焦点编辑)。我知道如何枚举子窗口,但我不知道如何检测子窗口是否处于活动状态(焦点)。
答案 0 :(得分:1)
基本上它只是一个简单的Linq查询:
var active = (from form in Application.OpenForms.OfType<Form>()
where form.Focused
select form).FirstOrDefault();
活动可以为null或表单。只是一个很少形式的简短例子:
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
Form sample = new Form();
sample.Text = i.ToString();
sample.Show();
}
while (true)
{
var active = (from form in Application.OpenForms.OfType<Form>()
where form.Focused
select form).FirstOrDefault();
if (active != null)
Console.Write(active.Text);
Application.DoEvents();
Thread.Sleep(100);
}
}
}
答案 1 :(得分:0)
如果您正在寻找不同进程的活动子窗口,那么您可以将IntPtr与子窗口匹配到IntPtr
[DllImport("User32")]
public static extern IntPtr GetForegroundWindow();
如果这不是您想要的,请您详细说明一下您的问题。
答案 2 :(得分:0)
如果您正在谈论Mdi子窗口,您可以使用ActiveMdiChild,它是表单类的属性(在您的mdiparent上使用它)。
如果您正在谈论集中控制,您可以使用ActiveControl,这是每个容器控件的属性(例如您的所有表单)
答案 3 :(得分:0)
我在谷歌尝试超过2小时后得到了答案。这就是我所拥有的:
StringBuilder builder = new StringBuilder(500);
int foregroundWindowHandle = GetForegroundWindow();
uint remoteThreadId = GetWindowThreadProcessId(foregroundWindowHandle, 0);
uint currentThreadId = GetCurrentThreadId();
//AttachTrheadInput is needed so we can get the handle of a focused window in another app
AttachThreadInput(remoteThreadId, currentThreadId, true);
//Get the handle of a focused window
int focused = GetFocus();
//Now detach since we got the focused handle
AttachThreadInput(remoteThreadId, currentThreadId, false);
由于我们有焦点窗口的句柄,我们可以得到它的名称/类以及其他必要的信息
在这种情况下,我只是找出班级名称:
StringBuilder winClassName = new StringBuilder();
int numChars = CustomViewAPI.Win32.GetClassName((IntPtr)focused, winClassName,
winClassName.Capacity);