다양한 메시지 (예 : WM_POINTERMOVE, WM_KEYDOWN 등)를 보내서 다시 컴파일하지 않고 제어해야하는 미리 컴파일 된 WPF 응용 프로그램이 있습니다. 내가 시도한 제어 방법은 메시지를 애플리케이션 메시지 펌프에 주입하는 것이었다. 테스트로 나는 다른 Win32 응용 프로그램에서이 응용 프로그램에 대한 Windows 핸들을 얻은 다음 SendMessage 메시지를 보내도록 시도했습니다. WPF 응용 프로그램 메시지 펌프에 메시지 주입
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] (https : // msdn.microsoft.com/en-us/library/windows/desktop/ee684009.aspx)는 아마도 우리가 알지 못하는 것보다 더 나은 해결책 일 것입니다. – IInspectable
다음은 현재 수행중인 작업을 요약 한 것입니다. 일부 응용 프로그램의 비디오 출력을 캡처하는 응용 프로그램 (모든 응용 프로그램이 동일한 컴퓨터에서 실행되는 것은 아님)이 함께 혼합되어 있습니다. 창이 캡처되면 마우스 및 터치 메시지를 더 이상 수신 할 수 없습니다. WPF 애플리케이션으로 메시지를 라우팅하기 위해 이들 모두를 관리하는 애플리케이션을 원했습니다. 이미 WPF가 아닌 Windows가 캡처 된 Win32 앱에서이 작업이 이미 진행 중입니다. – Joel