gpt4 book ai didi

c# - 了解 AttachThreadInput - 分离失去焦点

转载 作者:可可西里 更新时间:2023-11-01 08:44:19 25 4
gpt4 key购买 nike

我在完全理解 AttachThreadInput 时遇到了一点问题。

我知道它正在“连接”2 个线程的消息队列,这(我想做的)允许我在前台强制我的窗口 (winforms)。

我可以用这个方法做什么:

private void SetForegroundWindowEx(IntPtr hWnd)
{
uint SW_SHOW = 5;
uint appThread = GetCurrentThreadId();
uint foregroundThread = GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero);

if (foregroundThread != appThread)
{
AttachThreadInput(foregroundThread, appThread, true);

BringWindowToTop(hWnd);
ShowWindow(hWnd, SW_SHOW);
AttachThreadInput(foregroundThread, appThread, false);

}
else
{
BringWindowToTop(hWnd);
ShowWindow(hWnd, SW_SHOW);
}
}

然而,一旦线程分离,两个窗口都会失去焦点。

如果我等待消息队列清空 (Application.DoEvents()) 并激活我的窗口(现在处于前台但未获得焦点),它将重新获得焦点并保持它。

如果我在消息队列为空之前执行此操作,它将再次失去焦点。

所以我猜某些分离会把焦点从我的窗口移开,但我不知道那是什么或如何防止它。

这是我不太明白的第一件事。

我没有得到的第二件事是,如果我没有将我的窗口设置为前景:

AttachThreadInput(foregroundThread, appThread, true);

AttachThreadInput(foregroundThread, appThread, false);
Application.DoEvents();
this.Activate();

等待消息队列清空,并激活我的窗口(这次它不在前台,另一个窗口仍然有焦点),它实际上被激活了,即使线程不再被附加。

也许对 AttachThreadInput 有更好理解的人可以回答我这两个问题。

信息:
在这种情况下,我需要转移焦点,因为我的应用程序是通过 API 调用的。另一个调用我的应用程序,等待我的应用程序的反馈,并且在大多数情况下会卡住,直到它获得信息。

如果其他应用程序是全屏,许多用户不会注意到任务栏中的闪烁,并认为其他应用程序崩溃并使用 Taskmamanger 将其终止。因为我不一定能控制其他应用程序,所以我不能告诉它把焦点设置到我的窗口。

如果不是绝对必要,则不会调用此方法,在这种情况下,这种行为是敌对的,我知道,我自己和用户都希望这样做。

最佳答案

这是我用于相同目的的一段 C# 代码。我想指出,在某些合法情况下可能需要这样做。在我们的情况下,它是 MS Word 自动化。每当用户在我们的应用程序中单击工具栏按钮时,我们应该立即将 Word 窗口引起用户的注意。

public static void ForceWindowIntoForeground(IntPtr window)
{
uint currentThread = Win32.GetCurrentThreadId();

IntPtr activeWindow = Win32.GetForegroundWindow();
uint activeProcess;
uint activeThread = Win32.GetWindowThreadProcessId(activeWindow, out activeProcess);

uint windowProcess;
uint windowThread = Win32.GetWindowThreadProcessId(window, out windowProcess);

if (currentThread != activeThread)
Win32.AttachThreadInput(currentThread, activeThread, true);
if (windowThread != currentThread)
Win32.AttachThreadInput(windowThread, currentThread, true);

uint oldTimeout = 0, newTimeout = 0;
Win32.SystemParametersInfo(Win32.SPI_GETFOREGROUNDLOCKTIMEOUT, 0, ref oldTimeout, 0);
Win32.SystemParametersInfo(Win32.SPI_SETFOREGROUNDLOCKTIMEOUT, 0, ref newTimeout, 0);
Win32.LockSetForegroundWindow(LSFW_UNLOCK);
Win32.AllowSetForegroundWindow(Win32.ASFW_ANY);

Win32.SetForegroundWindow(window);
Win32.ShowWindow(window, Win32.SW_RESTORE);

Win32.SystemParametersInfo(Win32.SPI_SETFOREGROUNDLOCKTIMEOUT, 0, ref oldTimeout, 0);

if (currentThread != activeThread)
Win32.AttachThreadInput(currentThread, activeThread, false);
if (windowThread != currentThread)
Win32.AttachThreadInput(windowThread, currentThread, false);
}

关于c# - 了解 AttachThreadInput - 分离失去焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17879890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com