2

私はここで見つけた TwainDotNet ソリューション ( C# TWAIN 相互作用) をコンパイルしようとしていますが、頭がいっぱいです。

このソリューションは明らかに VS 2008 で開発されたもので、私は 2005 年に取り組んでいます (現時点では選択肢はありません)。2005 年にこれをすべてコンパイルするのにおそらくかなりの時間を費やし、エラーを 2 つに減らしました。両方のエラーは同じ 1 つの問題です。

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace TwainDotNet.WinFroms
{
  /// <summary>
  /// A windows message hook for WinForms applications.
  /// </summary>
  public class WinFormsWindowMessageHook : IWindowsMessageHook, IMessageFilter
  {
    IntPtr _windowHandle;
    bool _usingFilter;

    public WinFormsWindowMessageHook(Form window)
    {
      _windowHandle = window.Handle;
    }

    public bool PreFilterMessage(ref Message m)
    {
      if (FilterMessageCallback != null)
      {
        bool handled = false;
        FilterMessageCallback(m.HWnd, m.Msg, m.WParam, m.LParam, ref handled);
        return handled;
      }

      return false;
    }

    public IntPtr WindowHandle { get { return _windowHandle; } }

    public bool UseFilter
    {
      get
      {
        return _usingFilter;
      }

      set
      {
        if (!_usingFilter && value == true)
        {
          Application.AddMessageFilter(this);
          _usingFilter = true;
        }

        if (_usingFilter && value == false)
        {
          Application.RemoveMessageFilter(this);
          _usingFilter = false;
        }
      }
    }

    public FilterMessage FilterMessageCallback 
    {
      get; 
      set;
    }
  }

}

デリゲート インスタンスにアクセスするプロパティでコンパイルが失敗します。

エラー: 'TwainDotNet.WinFroms.WinFormsWindowMessageHook.FilterMessageCallback.get' は、abstract または extern とマークされていないため、本文を宣言する必要があります

このクラスが実装するインターフェイス IWindowsMessageHook は次のとおりです。

using System;
using System.Collections.Generic;
using System.Text;

namespace TwainDotNet
{
  public interface IWindowsMessageHook
  {
    /// <summary>
    /// Gets or sets if the message filter is in use.
    /// </summary>
    bool UseFilter { get; set; }

    /// <summary>
    /// The delegate to call back when the filter is in place and a message arrives.
    /// </summary>
    FilterMessage FilterMessageCallback { get; set; }

    /// <summary>
    /// The handle to the window that is performing the scanning.
    /// </summary>
    IntPtr WindowHandle { get; }
  }

  public delegate IntPtr FilterMessage(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled);
}

私は代理の初心者であることを認め、ここで途方に暮れています。VS 2005 でこの機能を複製するにはどうすればよいですか?

時間をありがとう。

4

3 に答える 3

0

イベントは望ましいかもしれませんが、デリゲート プロパティとして:

private FilterMessage filterMessageCallback;
public FilterMessage FilterMessageCallback 
{
  get {return filterMessageCallback;}
  set { filterMessageCallback = value;}
}

エッジケース (thread-race / null) を回避するには、以下も必要になる場合があります。

public bool PreFilterMessage(ref Message m)
{
  FilterMessage callback = FilterMessageCallback;
  if (callback != null)
  {
    bool handled = false;
    callback(m.HWnd, m.Msg, m.WParam, m.LParam, ref handled);
    return handled;
  }

  return false;
}
于 2009-12-02T17:29:24.910 に答える
0

プロパティ宣言の空白を埋めます -- 魔法は何も起きていません:

private FilterMessage _filterMessageCallback;

public FilterMessage FilterMessageCallback
{
    get { return _filterMessageCallback; }
    set { _filterMessageCallback = value; }
}
于 2009-12-02T17:30:32.417 に答える
0

バッキングフィールドを使用するだけです:

private FilterMessage m_FilterMessageCallback;
public FilterMessage FilterMessageCallback 
{
  get { return m_FilterMessageCallback; }
  set { m_FilterMessageCallback = value; }
}

インターフェイスのコード

FilterMessage FilterMessageCallback { get; set; }

ところで持っています。C#2.0/3.0 とは関係なく、setter と getter を使用した通常のインターフェイス定義です。

于 2009-12-02T17:30:32.683 に答える