我有这样的代码:
// Create event handler delegate
symbolReader.ReadNotify += new EventHandler(symbolReader_ReadNotify);
在我的手持设备上扫描条形码时,会调用symbolReader_ReadNotify
。
这是该方法的简化版本:
/// <summary>
/// Event that fires when a Symbol scanner has performed a scan.
/// </summary>
private void symbolReader_ReadNotify(object sender, EventArgs e)
{
ReaderData readerData = symbolReader.GetNextReaderData();
// If it is a successful scan (as opposed to a failed one)
if (readerData.Result == Results.SUCCESS)
{
// Setup the next scan (because we may need the scanner
// in the OnBarcodeScan event below
Start();
// Get the handle of the window that the user was on when the scan was sent.
IntPtr handle = CoreDLL.GetTopWindow();
// If we have a barcode scanner method for this window then call that delegate now.
if (_scanDelegates.ContainsKey(handle))
{
Action<BarcodeScannerEventArgs> scanDelegate;
// Get the method to call for this handle
// (previously added to the _scanDelegates dictionary)
bool delegateRetrieved = _scanDelegates.TryGetValue(handle, out scanDelegate);
if (delegateRetrieved && (scanDelegate != null))
scanDelegate(e);
}
}
}
大部分时间都可以正常工作。但是当对scanDelegate
的调用打开一个新窗口,也需要接受扫描时,事件(symbolReader.ReadNotify
)不会触发(当在该窗口上完成扫描时)。但是一旦窗口关闭(并且scanDelegate(e)
返回),事件就会触发(但现在我将它路由到错误的窗口。
是否有人告诉应用程序发送事件?它是否像Windows消息一样工作(即有一种方法可以刷新消息),还是只是符号库无法发送事件,直到为时已晚?)
我尝试过的一件事就是在打开的窗口中循环调用Application.DoEvents
。但这似乎不起作用。
注意:这是一个Compact Framework应用程序,但我认为这不是Compact Framework问题,因此我没有使用Compact Framework对其进行标记。
任何在扫描发生时触发事件的建议(就像它不是嵌套扫描时那样)会很棒!
答案 0 :(得分:1)
scanDelegate(e)是否以对话框的形式打开新窗口?如果是这样,它将阻止事件再次提升,直到它被关闭,因为它是从同一个事件处理程序中调用(打开)。
您可以通过在处理事件后延迟开放来解决问题,而不是将其作为对话框打开或在新线程上打开(或在代理上使用begininvoke)