2012-03-21 3 views
3

저는 스캔을 위해 TwainDotNet을 사용하는 응용 프로그램을 작성하고 있습니다.다른 스레드의 창에서 메시지를 필터링 할 수 있습니까?

모두 정상적으로 작동하지만 스캔하면 사용자 인터페이스를 사용할 수 없게됩니다. 그래서 나는 다른 스레드에서 스캔하기로 결정했지만 검색 성공 이벤트를 결코 얻지 못했습니다.

public DataSourceManager(Identity applicationId, 
    IWindowsMessageHook messageHook) 
{ 
    // Make a copy of the identity in case it gets modified 
    ApplicationId = applicationId.Clone(); 

    ScanningComplete += delegate { }; 
    TransferImage += delegate { }; 

    _messageHook = messageHook; 
    _messageHook.FilterMessageCallback = FilterMessage; 
    IntPtr windowHandle = _messageHook.WindowHandle; 

    _eventMessage.EventPtr = 
      Marshal.AllocHGlobal(Marshal.SizeOf(typeof(WindowsMessage))); 

그리고 필터링을 수행하는 방법 : 그래서 구현에 대해 자세히 살펴하기로 결정

protected IntPtr FilterMessage(IntPtr hwnd, int msg, IntPtr wParam, 
    IntPtr lParam, ref bool handled) 
{ 

는 일반적으로이 방법은 메시지의 로그를 필터,하지만 난 다른 스캔하는 경우 실을받지 못했습니다.

내 코드의 스캔 부분은 다음과 같습니다

var scanningThread = new Thread((ThreadStart) delegate 
    { 
     // Previously I got the main UI form here, but that didn't work either 
     var form = new Form(); 
     var messageHook = new WinFormsWindowMessageHook(form.Handle); 

     var scanner = new TwainEngine(messageHook); 
     scanner.TransferImage += TransferImage; 
     scanner.ScanningComplete += ScanningComplete; 
     scanner.StartScanning(twainSettings); 

    }); 
    scanningThread.Start(); 

내가는 Win32 메시지 아키텍처에 대한 아무것도 몰라 그래서 나는이 문제를 해결할 수 또는 무엇 발생하면이 문제가 도움이 될 것입니다 방법에 대한 입력.

+0

친구, 잘못된 길을 걷고 있습니다. 다른 스레드에서 양식을 만들지 마십시오. 그리고 표시되지 않은 양식의 핸들은 쓸모가 없습니다. 검사가 끝나기를 기다리는 동안 GUI를 차단하지 않습니까? – Brannon

+0

@Brannon : 답변 해 주셔서 감사합니다. 나는 아무것도 막지 않을 것이라고 확신한다. 라이브러리와 함께 제공되는 데모 프로그램에도 동일한 문제가 있습니다. – xsl

답변

2

메시지 루프가없는 스레드에서 양식을 작성하기 때문에 코드가 제대로 작동하지 않습니다. 이 라이브러리가 실제로 폼이나 메시지 루프를 필요로하는 경우 UI를 중단하고 디자인 문제가있는 경우를 제외하고는 메시지 루프를 실행하는 두 번째 스레드를 고려하는 매우 드문 시나리오 중 하나 일 수 있습니다.

메시지 루프를 실행하는 스레드를 만들려면 Application.Run을 사용하십시오. 수정 된 코드는 다음과 같습니다.

var scanningThread = new Thread((ThreadStart) delegate 
{ 
    var form = new Form(); 
    form.Load += (sender, args) => 
    { 
     var messageHook = new WinFormsWindowMessageHook(form.Handle); 
     var scanner = new TwainEngine(messageHook); 
     scanner.TransferImage += TransferImage; 
     scanner.ScanningComplete += ScanningComplete; 
     scanner.StartScanning(twainSettings); 
    }; 
    Application.Run(form); 
}); 
scanningThread.Start(); 

하나 이상의 UI 스레드가 있으면 이상한 문제가 발생할 수 있으므로 일반적으로 권장하지 않는다는 점을 지적해야합니다. 그러나, 내가 말했듯이, 당신은 선택의 여지가 없을 수도 있습니다. 또한이 두 UI 스레드에서 발생하는 모든 활동을 완전히 분리하십시오. 이 보조 UI 스레드에서 기본 UI 스레드에서 실행중인 UI 컨트롤에 액세스하지 마십시오. 발생할 수있는 모든 종류의 예측할 수없는 장엄한 문제가 있습니다. 한 스레드에서 작업이 수행되도록하려면 Invoke 또는 BeginInvoke을 사용하여 대리자 실행을 마샬링합니다.

+0

답장을 보내 주셔서 감사합니다. 나는 시간이있을 때 그것을 시도 할 것이다. – xsl

+0

고마워요, 양식을 숨기고 스캔이 완료된 후 닫으라는 방법으로 수정했습니다. – xsl

관련 문제