gpt4 book ai didi

c# - 以编程方式在 Microsoft RemoteApp 中查找子窗口

转载 作者:行者123 更新时间:2023-11-30 17:21:00 34 4
gpt4 key购买 nike

背景

我正在使用 SendKeys() 将键盘命令发送到事件窗口,但是当应用程序通过 RemoteApp 运行时我没有找到子窗口。当我在本地运行应用程序时,一切都按预期工作。

Microsoft RemoteApp允许用户通过 RDP 协议(protocol)连接到应用程序,但它不会显示整个远程虚拟机,而只是显示应用程序窗口。对于最终用户而言,在 RemoteApp 下运行的应用程序与在其桌面上运行的应用程序没有区别。

我一直在使用 ManagedSpy 来确定 .NET 应用程序窗口的类名,这样我就可以使用 Win32 API 函数 FindWindowEx 激活其中一个子窗口,而且效果很好.但是,当应用程序在 RemoteApp 上运行时我遇到了问题。

我仍然可以使用 .NET Process.GetProcessesByName() 来查找应用程序,我只需要让它调用 mstsc.exe:

IntPtr hwndChild = IntPtr.Zero;
Process[] processess = Process.GetProcessesByName("mstsc");
IntPtr appHandle = IntPtr.Zero;

foreach (Process p in processess)
{
if ((p.MainWindowHandle != IntPtr.Zero))
{
appHandle = p.MainWindowHandle;
}
}

if (appHandle == IntPtr.Zero)
{
MessageBox.Show("Application is not Running.");
return;
}

但是,我不能以同样的方式使用 FindWindowEx。这个问题围绕着那个。

为了让非托管代码告诉我哪些窗口 mstsc.exe 处于事件状态,我使用了 Spy++,但是对于 mstsc.exe 它返回了一个不同的类名,称为 RAIL_WINDOW:

alt text

这是我用来查找子窗口的代码:

[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
hwndChild = FindWindowEx(appHandle, IntPtr.Zero, "RAIL_WINDOW", "MyApplication (Remote)");
SetForegroundWindow(hwndChild);

问题

  1. 我可以使用 Spy++ 突出显示 RemoteApp 版本应用程序中的事件子窗口,并且我得到 RAIL_WINDOW,但我似乎无法以编程方式访问此窗口。鉴于上面的代码,我缺少什么才能做到这一点?

  2. 是否有其他方法可以将键盘敲击发送到在 Remote App 上运行的应用程序?

最佳答案

了解 Microsoft 的工作方式后,我敢打赌“轨道窗口”只不过是一个愚蠢的本地代理,它不会费心响应 SendKeys 发送的内容。我没有看,但我敢打赌最终会发送 WM_CHAR 消息,一个愚蠢的代理可能不会费心去响应。相反,请尝试手动向其发送 WM_KEYUP 和 WM_KEYDOWN 消息,看看是否可行,因为我希望它会传输这些和鼠标点击(以及不传输)而不是翻译版本。

关于c# - 以编程方式在 Microsoft RemoteApp 中查找子窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3841486/

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