2012-11-07 1 views
3

하위 프로세스를 생성하는 win32 기본 응용 프로그램이 있습니다.다른 프로세스에서 HWND의 lpfnWndProc 설정

현재 CreateWindowEx를 사용하여 주 응용 프로그램에서 HWND를 만들고 하위 프로세스를 생성합니다. 그런 다음 자식 프로세스는 FindWindow를 사용하여 HWND를 찾습니다. 자식 프로세스에서이 HWND에 대한 Window 메시지 (예 : WM_SIZE, WM_SETFOCUS 등)를 처리하고 싶습니다. 따라서 자식 프로세스에서 GWLP_WNDPROC 특성을 설정하려고했지만 합리적인 액세스 거부 오류가 발생했습니다.

대신 자식 프로세스에서 직접 HWND를 만드는 것에 대해 생각했지만 창을 클릭하면 주 응용 프로그램이 포커스를 잃어 사용 사례에 적합하지 않습니다.

자식 프로세스가 메시지를 처리하는 동안 주 응용 프로그램에 집중하기 위해 수행해야 할 작업에 대한 제안이 있습니까?

+0

다른 프로세스에서 창 프로 시저를 변경할 수있는 경우에도 하위 프로세스의 함수 포인터가 기본 프로세스에서 유효하지 않기 때문에 도움이되지 않으므로 다음에 메시지를받을 때 주 프로세스가 충돌합니다 . 왜 자식 프로세스가 주 프로세스의 창에 "WM_SIZE 및 WM_SETFOCUS 동작을 변경하십시오"라는 메시지를 보내지 않도록할까요? –

+0

그러면 모든 메시지 처리가 주 응용 프로그램에서 수행되기 때문입니다. 자식 프로세스는 자체 포함되어 항상 연결된 HWND를가집니다. 주 응용 프로그램은 여러 하위 프로세스를 생성 할 수 있습니다. 이상적인 시나리오는 하위 프로세스에서 HWND를 만들지 만 클릭해도 주 응용 프로그램에 집중하지 않는 것입니다. –

+1

나는 당신이 만족스럽게이 일을 할 수 없을 것이라고 생각합니다. 이 전체 계획을 수행하여 해결하려는 문제는 무엇입니까? 더 좋은 방법이있을 수 있습니다. – jcoder

답변

1

다른 창에가는 메시지를 가로 챌 수있는 창 메시지 후크 중 하나 (예 : WH_CALLWNDPROC)에 사용 SetWindowsHookEx, 다음 문제의 윈도우의 HWND에 의해 필터링 할 수 있습니다.

+0

몇 가지 코드 샘플을 제공해 주시겠습니까? 나는 winapi에 정말로 새로운 사람입니다. 감사. –

1

을 자녀의 과정에서 당신이 WS_NOACTIVATE으로이 ShowWindow를 호출 할 수 있습니다 . CreateProcess 함수를 호출 할 때 다음과 같이 STARTUPINFO을 지정할 수 있습니다. 당신은 심지어 명시 적으로 메인 창에 귀하의 자녀 응용 프로그램에 초점을 돌려 줄 수

si.dwFlags = STARTF_USESHOWWINDOW; 
si.wShowWindow = SW_SHOWNOACTIVATE; 

크롬이하는 것과 비슷한 디자인을 원한다고 가정합니다. 당신이 그들의 디자인 문서에 자세히 보면 :

http://www.chromium.org/developers/design-documents/inter-process-communication

당신은 그들이 프로세스 간의 IPC를 구현 할 것을 볼 수 있지만 주요 과정에서 하나의 메시지 처리 기능이 없습니다.

마지막 힌트 - 질문과 관련이 없으며 창 아래의 작업에 대한 읽기 -이 메커니즘을 사용하면 하위 프로세스를보다 자세히 제어 할 수 있습니다.

+0

예 디자인이 Chromium과 비슷합니다. 특히, 여러 하위 프로세스를 생성 할 수있는 Chrome과 같은 주요 응용 프로그램이 있습니다. 이러한 하위 프로세스 각각을 Chrome의 탭으로 상상할 수 있습니다. 기본 응용 프로그램의 크기가 조정되면 탭의 내용도 크기를 조정해야합니다. 시도한 두 가지 해결책 : 1.자식 프로세스는 HWND를 생성합니다. 이것은 "탭"에 포커스가있을 때 포커스를 잃는 메인 어플리케이션으로 이어집니다. 2. 메인 어플리케이션은 HWND를 생성하고 자식 프로세스는 렌더링을 위해이 HWND를 사용합니다. 자식 프로세스에서 이벤트 (예 : WM_SIZE)를 가로 챌 수 없습니다. –

+0

메인 애플리케이션에서는 창을 생성 할 수 있지만 하위 프로세스에서는 모든 처리를 수행 할 수 있습니다. 무언가가 시각화 될 필요가있을 때, 자식 프로세스는 메인 윈도우에 원시 이미지를 보여줍니다. 사실 여기에 매핑 된 메모리를 사용할 수 있으며 필요할 때 주 프로세스가 읽을 수 있도록 복사 할 수 있습니다. 이렇게하면 깜박임을 피하기 위해 필요한 이중 버퍼링을 단순화합니다. 그렇지 않으면 메인 윈도우가 움직일 때마다 하위 프로세스 윈도우를 추적해야하며, z- 순서가 정확하고 포커스가 맞도록 유지해야합니다. – marcinj

+0

하위 프로세스에서 처리를 수행하려면 어떻게해야합니까? 주 응용 프로그램이 현재 Window 프로 시저를 소유하고 있으므로 주 응용 프로그램에서 이러한 이벤트를 하위 응용 프로그램으로 전달해야합니까? –