2011-07-05 4 views
0

표준 win32 dll로 제어되는 장치가 있습니다. 장치 응답은 응용 프로그램 창 핸들을 통해 다시 전송됩니다 (연결될 때 필요함). 지금 당장은 메시지를 살펴 봐야하는 유일한 방법은 양식 내부의 WndProc를 재정의하는 것입니다.이 방법은 상당히 제한적입니다.C에서 DLL의 메시지를들을 수있는 방법 #

원래 내 의도는 dll 내에 모든 것을 배치하여 응용 프로그램에서 장치 베어 처리를 가능하면 많이 분리하려고했지만이 종속성으로 인해 나를 달성하지 못하게되었습니다.

양식 (a la WndProc)이 아닌 dll에서받은 메시지를 들여다 볼 수있는 후크가 필요합니다. 내가 본 모든 것은 dll이 아닌 동일한 형식에서 후크를 보여줍니다.

오, 그건 그렇고, 후크는 WPF와도 호환된다는 것을 이해합니다. 여기에는 요구 사항도 있습니다.

의견을 보내 주시면 감사하겠습니다.

+0

아니, 그렇게하는 방법입니다. 확실히 DLL에 양식 인스턴스를 만들 수있는 이유는 없습니다. 그리고 폼 클래스는 다른 .NET 클래스와 마찬가지로 단순한 클래스입니다. 장치 코드에서 찾을 수있는 한 시각적 창 일 필요는 없습니다. –

+0

여기에 문제가 있습니다. 장치가 창을 응용 프로그램의 기본 폼이라면 장치는 메시지를 보냅니다. Application.Run을 사용하여 만들거나 ShowDialog를 사용하여 표시해야합니다. 따라서 숨기거나 만들거나 내부에서 파생시킬 수 없습니다 클래스. 난 wndprc를 사용하여 그것을 시도하고 메시지가 단순히 표시가 중단되었습니다. 아, 그런데 IMessageFilter를 시도해 보았습니다. 특별한 이유없이 몇 가지 메시지를 건너 뛰었습니다. –

답변

1

IMessageFilter는 보낸 메시지 만 제공하며 보낸 메시지는 제공하지 않습니다. 물론 기기 코드가 앱의 메인 윈도우 사용을 주장한다면 할 수있는 일은 거의 없습니다. 주 앱의 핸들 값이 무엇인지 알려주는 공개 메소드를 추가해야합니다. 그런 다음 NativeWindow에서 클래스를 파생시켜 해당 기본 창을 하위 클래스로 만들고 메시지를 간첩 할 수 있습니다. AssignHandle() 메서드를 사용하고 WndProc()를 재정 의하여 스눕시킵니다. DefWndProc()을 호출하여 장치와 관련이없는 메시지가 있는지 확인하십시오. WM_CLOSE를 감지하여 윈도우의 서브 클래스를 해제 할 수 있어야하므로 ReleaseHandle()을 호출하십시오.

+0

당신의 제안은 갈 길인 것처럼 보인다. 나는 그것을 시도 할 것이다. 숨겨진 컨트롤로 작업하고 있지만 WPF에서 작동하지 않을 것이므로 대신이 작업을 시도 할 것입니다. 고맙습니다! 결과가 바로 돌아 오면 ... –

+0

WPF에서도 작동하며 일반 Windows 창도 사용합니다. 손잡이를 잡기 위해 좀 더 번거 로움. –

+0

그것은 효과가있다. WindowInteropHelper를 사용하여 WPF 창에서 IntPtr을 가져와야했지만 그 외에는 완벽하지 않았습니다. 대단히 감사합니다!전에이 대안에 대해 조언을 받았지만, 분명히 필수적인 AssignHandle 요구 사항이 누락되었습니다. 다시 한 번 감사드립니다! –

0

그냥 WndProc에서 호출하는 DLL 안에 메서드를 추가하지 않는 이유는 무엇입니까?

//In the DLL 
public bool HandleMessage(/*args go here that I forget*/) { 
    if(/*message is for me*/) { 
     //handle it 
     return true; 
    } 
    return false; 
} 

//in WndProc 
if(MyObject.HandleMessage(/*args*/)) { 
    return true; 
} 
//do whatever else 
+0

내가 사용하는 모든 장치가 이런 종류의 콜백 방법론을 필요로하지 않기 때문에 응용 프로그램 창에서 코드를 분리하려고합니다. 이 클래스는 응용 프로그램에서 사용하는 표준 인터페이스를 구현하므로 디자인 패턴에 영향을줍니다. 생각해 줘서 고마워. –

+0

알았습니다! 누군가 다른 사람이 이런 구덩이에 빠지면. 더럽지 만 작동합니다. 내 dll에서 Control 클래스를 만들고이를 인스턴스화 중에받은 기본 창에 연결했습니다. 양식에 첨부 할 수 있도록 공개해야하는 Control 클래스 내에서 WndProc 재정의 함수를 삽입했습니다. 그것은 효과가있다! 그것은 두 세계의 혼합이지만 내 dll withing에서 장치의 메시지를 캡처하기 시작했다! 모두에게 제안 해 주셔서 감사합니다. 나는이 질문을 닫기 전에 두 시간을 기다려야 만한다. –

관련 문제