我想将一个pressKey事件发送到某个应用程序,该应用程序不是Windows中的活动应用程序,所以我必须使用sendMessage / postMessage api调用。
但是,我需要知道应用程序中活动的确切子窗口并向其发送pressKey消息...
我正在使用GetTopWindow和GetWindow(GW_CHILD)api调用来获取主窗口的顶级子窗口,并使用获取的子窗口再次执行以获取顶级孙子窗口,并继续执行它直到我找到一个带有子窗口的子窗口没有更多的儿童窗口。这适用于某些应用程序,但在某些情况下它不适用。有时父窗口是活动窗口,而不是其子窗口之一,因此获取父窗口的顶级子窗口将无法工作,因为我将向错误的窗口发送消息。
我发现这样做的唯一方法(获取实际活动窗口的处理程序)是使用GuiThreadInfo api调用,但它仅在目标应用程序是Windows中的活动应用程序时才有效。正如我在开头提到的那样,处理程序并非如此。
我可以使用setForegroundWindow api调用将应用程序带到顶部,但我不想这样做。我还尝试了AttachThreadInput和GetFocus api调用,但同样,它们仅在目标应用程序是活动应用程序IN窗口时才有效。
有什么想法吗?感谢
答案 0 :(得分:1)
我假设你已经尝试过的东西,你知道如何获得主窗口的句柄,但如果你不只是留下评论,我会发布一个代码片段。
我结合了网上发现的一些事情来解决这个问题,但主要的是one。我没有一个很棒的应用程序来测试它,但它在一个简单的情况下工作。一个例外是,我认为如果你在你的应用程序中使用工具窗口它将不会找到它,因为我认为GetLastActivePopup方法不包括它们(不确定,并且没有测试该情况)。 / p>
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool IsWindowVisible(IntPtr hWnd);
[DllImport("user32.dll")]
static extern IntPtr GetLastActivePopup(IntPtr hWnd);
[DllImport("user32.dll", ExactSpelling = true)]
static extern IntPtr GetAncestor(IntPtr hwnd, uint gaFlags);
const uint GA_PARENT = 1;
const uint GA_ROOT = 2;
const uint GA_ROOTOWNER = 3;
public static IntPtr GetAppActiveWindow(IntPtr hwnd)
{
IntPtr activeAppWindow = IntPtr.Zero;
if (hwnd != IntPtr.Zero)
{
//Get the root owner window (make sure we are at the app window
//if you already have a handle to the main window shouldn't have
//to do this but I put it in just in case
hwnd = GetAncestor(hwnd, GA_ROOTOWNER);
while ((activeAppWindow =
GetLastActivePopup(hwnd)) != activeAppWindow)
{
if (IsWindowVisible(activeAppWindow))
break;
hwnd = activeAppWindow;
}
}
return activeAppWindow;
}
答案 1 :(得分:0)
如果您知道Window标题和Window类名,请查看FindWindow()和FindWindowEx(),看看它们是否符合您的需求。
FindWindow():http://msdn.microsoft.com/en-us/library/ms633499.aspx
FindWindowEx():http://msdn.microsoft.com/en-us/library/ms633500(VS.85).aspx