【发布时间】:2016-09-14 21:00:48
【问题描述】:
我有一些预编译的 WPF 应用程序,我需要通过发送各种消息(例如:WM_POINTERMOVE、WM_KEYDOWN 等)来控制它们而无需重新编译它们。我尝试的控制方法是将消息注入应用程序消息泵。作为测试,我通过获取应用程序的 Windows 句柄然后使用 SendMessage 发送消息来尝试使用其他一些 Win32 应用程序。
BOOL CALLBACK EnumWindowsProc(
_In_ HWND hwnd,
_In_ LPARAM lParam
)
{
LPWSTR windowName = new TCHAR[256];
GetWindowText(hwnd, windowName, 256);
std::wstring windowNameString(windowName);
int position = windowNameString.find(std::wstring(L"MyApplicationWindowName"));
if (position > -1) {
hTargetWindow = hwnd;
delete windowName;
return FALSE;//stop enumerating windows
}
delete windowName;
return TRUE;
}
.....
EnumWindows(EnumWindowsProc, NULL);;
SendMessage(hTargetWindow, MY_MESSAGE, 0, 0);
我使用 EnumWindows 检索了应用程序的 HWND(效果很好)。然后我使用 SendMessage 和 PostMessage 来发送我的消息。而其他应用程序对此 WPF 应用程序没有响应。作为另一项测试,我制作了一个 WPF 应用程序并添加了一些代码,以便在收到特定消息时设置断点。
ComponentDispatcher.ThreadFilterMessage += (ref MSG msg, ref bool handled) =>
{
if(msg.message == MY_MESSAGE)
Debug.WriteLine("break");
};
断点永远不会命中,表明消息没有进入消息泵。在其他类型的应用程序中尝试相同的事情会取得成功。注入这些消息我做错了什么。
【问题讨论】:
-
我不知道,但你这里有内存泄漏:
LPWSTR windowName = new TCHAR[256]; -
UI Automation 可能是一个更好的解决方案,尽管我们不知道您真正想要完成什么。
-
这里试图总结一下我在做什么:有一个应用程序正在捕获几个应用程序的视频输出(并非所有应用程序都在同一台机器上运行)并将它们混合在一起。当窗口被捕获时,它不能再接收鼠标和触摸消息。我希望管理所有这些的应用程序将这些消息路由到 WPF 应用程序。这已经适用于捕获窗口的 Win32 应用程序,而不是 WPF。