【发布时间】:2022-01-23 23:44:51
【问题描述】:
我正在尝试制作一个允许我从“Microsoft Teams”复制聊天(存档)的应用程序。
我使用 SPY++ 来获取窗口句柄,然后在我的程序中使用 WIN32 调用来获取相同的句柄
foreach (Process process in Process.GetProcesses())
{
if (process.MainWindowTitle.Contains("Microsoft Teams"))
{
IntPtr hwnd = process.MainWindowHandle;
EnumChildWindows(hwnd, callBackPtr, windowHandles);
StringBuilder sb = new(length);
foreach (object childHwnd in windowHandles)
{
GetClassName((IntPtr)childHwnd, sb, sb.Capacity);
if (sb.ToString().Contains("D3D", StringComparison.CurrentCultureIgnoreCase))
{
teamsChatWindowHwnd = (IntPtr)childHwnd;
break;
}
}
}
然后我想使用 SendKeys 发送鼠标滚动以向上滚动到最早的消息。我还没有完全弄清楚我将如何分辨,但这是一个循序渐进的过程。
SendMessage 代码
RECT rect;
GetClientRect(teamsChatWindowHwnd, out rect);
Point p = new Point(500, 500);
for (int i = 0; i < 100; i++)
SendMessage(teamsChatWindowHwnd, WM_MOUSEWHEEL, -120 << 16, ref p);
我尝试了不同版本的 SendMessage,并且还在记事本窗口上进行了测试。带有 SPY++ 的记事本窗口我可以看到正在发送的消息。使用 Teams,我看不到任何正在发送的消息。团队窗口是类:中级 D3D 窗口。
我也曾在 Google 上搜索过,试图找到类似的应用程序或其他任何东西,但似乎没有任何应用程序可以做到这一点。对于大多数归档方法,您必须是管理员。在网络版中尝试过几次,但似乎都没有对我有用。
【问题讨论】:
-
鉴于名称“中间 D3D 窗口”,它似乎不太可能是处理输入的窗口。操作另一个应用程序的受支持方式是 UI 自动化。这就是辅助技术程序用来控制其他应用程序的方法。
-
也许您应该使用正确的 Teams API,例如 docs.microsoft.com/en-us/graph/api/…
-
@Philip Borchert - 请确认您的问题是否已通过上述建议解决或仍在寻求帮助?
-
@Nivedipa-MSFT 不,这对我没有帮助。我想以普通用户而不是管理员的身份执行此操作。
-
@Raymond Chen 我研究了 ui 自动化,但没有找到任何有用的例子。
标签: c# winapi microsoft-teams spy++