2010-06-02 2 views
1

VB.NET에서 일부 작업을 수행하는 레거시 응용 프로그램을 시작하는 Windows 서비스를 개발 중입니다. 이 서비스는 레거시 앱을 둘러싼 래퍼 (wrapper) 역할을하므로 사용자는 수동 작업을 자동화 할 수 있습니다.다른 응용 프로그램에서 열린 메시지 상자 감지하기

레거시 앱에 messagebox가 표시되는 경우를 제외하고 모든 기능이 훌륭하게 작동합니다. 이 작업을 수행하면 메시지 상자가 닫힐 때까지 프로세스가 중단됩니다.

서비스가 서버에서 실행되므로 메시지 상자를 닫을 사용자가 없습니다.

이 서비스는 System.Diagnostics.Process의 레거시 응용 프로그램을 시작합니다.

System.Diagnostics.Process을 사용하여 시작한 프로세스에서 메시지 상자가 표시되었음을 감지하는 방법이 있습니까? 코드를 통해 messagebox를 닫을 수있는 방법이 있습니까?

답변

1

FindWindow을 사용하면 메시지 상자를 찾을 때까지 EnumChildWindows을 사용하여 자식 창을 모두 열거합니다 (메시지 상자가 응용 프로그램의 기본 창의 직접적인 자식이 아닌 경우 재귀 호출을해야 할 수도 있음).).

FindWindow 호출을 건너 뛸 수 있으며 MainWindowHandle 속성 (Process)을 대신 사용할 수는 있지만 작동하는지 확인하지 않았습니다.

이 모든 것을 살펴 보는 훌륭한 도구는 실행중인 프로세스에 대해 파악할 수있는 정보를 볼 수있는 Spy ++입니다.

+0

안녕하세요, 귀하의 회신에 감사드립니다. 솔루션을 작동시킬 수 없었습니다. EnumChildWindows는 메시지 상자가 아닌 기본 창만 반환했습니다. 나는 현재이 문서 http://www.codeproject.com/KB/dialog/WindowInterceptor.aspx?fid=1070466&df=90&mpp=25&noise=3&sort=Position&view=Quick&select에 따라 윈도우 메시지 후킹하여 솔루션을 일하고 = 2624936 – richie

2

또한 EnumChildWindows가 MessageBox를 반환하지 않는다는 사실을 발견했습니다. 그러나 나는 그것을하는 방법을 보여준 사이트를 발견했다. http://vbcity.com/forums/t/105842.aspx GW_ENABLEDPOPUP에서 전달하는 GetWindow를 호출하려고합니다. 그것은 매력처럼 작동했습니다. Scott Waletzko에게 감사드립니다!

관련 문제