2009-05-26 45 views
5

我有一個支持使用WIA進行掃描的C#(WinForm)程序。我正在嘗試在掃描一個或多個文檔之前設置設備屬性。主要我想設置掃描儀的紙張尺寸。以下是代碼片段:Windows圖像採集 - 在C#中設置設備屬性

foreach (Property property in selectedDevice.Properties) 
{ 
    //WiaProperties.WiaDpsHorizontalBedSize is my constant 
    if (property.PropertyID == WiaProperties.WiaDpsHorizontalBedSize) 
    { 
     //Set property value here...    
    } 
} 

我在找到Horizo​​ntal Bed Size屬性,但問題是如何將它設置爲一個值?有一個關於屬性的set_Value屬性,但似乎需要一個ref對象。所以我對如何在設備上設置屬性感到不知所措?

回答

10

我正在研究一個掃描項目,並且WIA的例子很少。這段代碼就是你想要設置牀的大小,DPI等等。用一個關於如何處理set_Value的例子來看看SetProperty方法。

class Scan 
{ 
    // Scanner only device properties (DPS) 
    public const int WIA_RESERVED_FOR_NEW_PROPS = 1024; 
    public const int WIA_DIP_FIRST = 2; 
    public const int WIA_DPA_FIRST = WIA_DIP_FIRST + WIA_RESERVED_FOR_NEW_PROPS; 
    public const int WIA_DPC_FIRST = WIA_DPA_FIRST + WIA_RESERVED_FOR_NEW_PROPS; 
    public const int WIA_DPS_FIRST = WIA_DPC_FIRST + WIA_RESERVED_FOR_NEW_PROPS; 
    public const int WIA_DPS_DOCUMENT_HANDLING_STATUS = WIA_DPS_FIRST + 13; 
    public const int WIA_DPS_DOCUMENT_HANDLING_SELECT = WIA_DPS_FIRST + 14; 
    public const int FEEDER = 1; 
    public const int FLATBED = 2; 
    public const int DUPLEX = 4; 
    public const int FEED_READY = 1; 

    WIA.CommonDialog _dialog = new WIA.CommonDialog(); 
    WIA.Device _scanner; 

    public void ADFScan() 
    { 

     _dialog = new CommonDialogClass(); 
     _scanner = _dialog.ShowSelectDevice(WIA.WiaDeviceType.ScannerDeviceType, false, false); 


     foreach (Property item in _scanner.Items[1].Properties) 
     { 
      switch (item.PropertyID) 
      { 
       case 6146: //4 is Black-white,gray is 2, color 1 
        SetProperty(item, 2); 
        break; 
       case 6147: //dots per inch/horizontal 
        SetProperty(item, 100); 
        break; 
       case 6148: //dots per inch/vertical 
        SetProperty(item, 100); 
        break; 
       case 6149: //x point where to start scan 
        SetProperty(item, 0); 
        break; 
       case 6150: //y-point where to start scan 
        SetProperty(item, 0); 
        break; 
       case 6151: //horizontal exent 
        SetProperty(item, (int)(8.5 * 100)); 
        break; 
       case 6152: //vertical extent 
        SetProperty(item, 11 * 100); 
        break; 
      } 
     } 
     ImageFile image = (ImageFile)_scanner.Items[1].Transfer(FormatID.wiaFormatPNG); 
     System.IO.File.Delete("tmp.png"); 
     image.SaveFile("tmp.png"); 
    } 

    private void SetProperty(Property property, int value) 
    { 
     IProperty x = (IProperty)property; 
     Object val = value; 
     x.set_Value(ref val); 
    } 


    public void test() 
    { 
     bool WantsToScan = true; 
     while (WantsToScan) ScanAndSaveOnePage(); 

    } 


    static void Main(string[] args) 
    { 
     new Scan().test(); 
    } 
} 
+0

不錯。你能解釋一下爲什麼這個演員是必要的嗎? IProperty x =(IProperty)屬性; – driAn 2009-08-04 21:16:20