2012-03-21 49 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 2012-03-22 05:18:54

+0

@Brannon:谢谢你的回应。我确信我没有阻止任何东西。该库附带的演示程序具有相同的问题。 – xsl 2012-03-22 09:25:10

回答

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控件。有各种不可预知的和壮观的问题将会发生。如果您需要强制在一个线程上执行某个操作,请使用InvokeBeginInvoke来编组委托的执行。

+0

非常感谢您的回复。当我有时间时,我会尝试。 – xsl 2012-03-22 14:36:31

+0

非常感谢,我修改它以隐藏表单并在扫描完成后关闭它。 – xsl 2012-03-22 18:00:18

相关问题