【发布时间】:2012-04-06 10:16:12
【问题描述】:
我正在编写一个使用 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 消息体系结构一无所知,因此任何有关我如何解决此问题或导致此问题的原因的意见都会有所帮助。
【问题讨论】:
-
伙计,你走错路了。不要在不同的线程上制作表格。未显示的表格句柄毫无价值。您确定在等待扫描完成时没有阻止 GUI?
-
@Brannon:感谢您的回复。我确定我没有阻止任何东西。库自带的demo程序也有同样的问题。
标签: c# windows multithreading messages