2010-04-24 2 views
3

콘솔 응용 프로그램 및/또는 독립 실행 형 DLL에서 Win32 메시지를 처리 ​​할 수 ​​있습니다.C++에서 콘솔 앱/DLL의 메시지 처리 Win32

C/C와 상응 할 수있는 방법이 있나요 나는 다음과 같은 기사 .NET에서 그것을 할 수 있었다 그것은 콘솔 응용 프로그램 및 독립 DLL
http://msdn.microsoft.com/en-us/magazine/cc163417.aspx

내부에 C#으로 잘 작동

++ Win32 API? 나는 RegisterClassEx (...)와 CreateWindow (...)를 hWndParent에 HWND_MESSAGE로 전달하려고 시도했지만 문제는 "보이지 않는"창이 생성 된 후에 메시지가 아마도 메시지 펌프가 없기 때문에 처리되지 않는다는 것이다. .

DLL 엔트리 포인트가있는 경우 메시지 펌프는 어디로 이동합니까? 나는 DLL에 다른 스레드를 만들고 (GetMesage (..)) while을 넣으려고했지만 그 중 하나도 작동하지 않았다.

아이디어가 있으십니까?

+1

메시지 펌프를 CreateWindow 호출과 동일한 스레드에 넣었습니까? – Gabe

+0

단지 호기심, 콘솔 응용 프로그램에서 어떤 종류의 Win32 메시지가 필요합니까? –

+0

@Gabe 나는 그 일을 시도하지 않았고, 다음에 시도 할 것이다. @Romain RegisterDeviceNotification을 호출 한 후 WM_DEVICECHANGE 메시지를 받겠다. –

답변

2

메시지 펌프가 필요합니다. 이 창은 또한 스레드 유사성을 가지므로 메시지 펌프를 실행중인 동일한 스레드에서 만들어야합니다. 기본 접근 방식은 건전합니다. 더 많은 코드를 포함 시키면 문제가 무엇인지 명확해질 수 있습니다.

2

Logan Capaldo가 말한 것 이외에도 DLL로 컴파일시에 런타임에 어떤 프로세스가로드 될지 모르는 문제가 있습니다.

  • 당신은 콘솔 응용 프로그램 (/ SUBSYSTEM : CONSOLE)에 의해로드되는 경우, 다음 자신의 숨겨진 창을 생성하고 같은 스레드에서 메시지 펌프를 설정하는만큼 당신이이기 때문에 (잘 작동합니다 생성 된 첫 번째 창).
  • Windows 응용 프로그램 (/ SUBSYSTEM : WINDOWS)에서로드하는 경우 메시지를 가져 오는 데 문제가 발생할 수 있습니다. 생성하지 않은 계층 구조의 최상위 창으로 전송됩니다. hWnd of the main process을 가져 와서 하위 클래스로 분류해야합니다 (아직 선택하지 않은 경우).
  • 서비스로로드하는 경우 창 메시지를 전혀받지 못합니다. 대신 RegisterServiceCtrlHandlerEx Function