2013-12-11 69 views
2

我正在尋找一種方法來檢測在RDP會話上更改默認打印機的時間。基本上,我們試圖記錄用戶上次默認的打印機,我覺得執行此任務的最簡單方法是檢測用戶何時更換打印機,而不是在註銷時捕獲默認打印機。到目前爲止,我已經看過幾個選項,其中一些選項在下面。如何知道默認打印機何時更改?

解決方案1 ​​

嘗試連接到本地打印監視器檢查默認打印機的變化。我發現這個網址FindPrinterFirstChangeNotification。我認爲這將通過使用PRINTER_CHANGE_SET_PRINTER標誌進行篩選來發揮作用。但是,當我更改UI中的默認打印機時,我沒有收到任何事件。

解決方案2

下一個選項是潛在的創造與WDK新的驅動程序趕上當打印機改變默認設置。

其他人對捕獲此事件有什麼想法嗎?我不知道是否有其他方法可以實現。

以下是我用於FindFirstPrinterChangeNotification的代碼。我能夠自己捕獲打印作業上的事件,但是我無法捕獲有關更改默認打印機的任何內容。

IntPtr test = IntPtr.Zero; 
PRINTER_DEFAULTS defaults = new PRINTER_DEFAULTS { DesiredAccess = PrinterAccessRights.READ_CONTROL }; 
Printer.OpenPrinter("Microsoft XPS Document Writer", out test, ref defaults); 
Operations.Log(new Win32Exception(Marshal.GetLastWin32Error()).Message, System.Diagnostics.EventLogEntryType.Error, 4); 
Printer.FindChangedEvent(test); 

捕獲事件的方法。

public static void FindChangedEvent(IntPtr handle) { 
    IntPtr ptr = FindFirstPrinterChangeNotification(handle, (uint)Printer_Change.ALL, 0, null); 
    Operations.Log(new Win32Exception(Marshal.GetLastWin32Error()).Message, System.Diagnostics.EventLogEntryType.Error, 4); 
    ManualResetEvent _ManualResetEvent = new ManualResetEvent(false); 
    _ManualResetEvent.SafeWaitHandle = new SafeWaitHandle(ptr, true); 
    RegisteredWaitHandle _RegisteredWaitHandle = ThreadPool.RegisterWaitForSingleObject(_ManualResetEvent, new WaitOrTimerCallback(PrinterNotifyWaitCallback), null, -1, true); 
} 

事件方法

private static void PrinterNotifyWaitCallback(object state, bool timedOut) { 
    if (timedOut) { 
     //Should not happen 
     return; 
    } else { 

    } 
} 

結構爲標誌

[Flags] 
public enum Printer_Change : uint { 
    ADD_PRINTER = 0x00000001, 
    SET_PRINTER = 0x00000002, 
    DELETE_PRINTER = 0x00000004, 
    FAILED_CONNECTION_PRINTER = 0x00000008, 
    PRINTER = 0x000000FF, 
    ADD_JOB = 0x00000100, 
    SET_JOB = 0x00000200, 
    DELETE_JOB = 0x00000400, 
    WRITE_JOB = 0x00000800, 
    JOB = 0x0000FF00, 
    ADD_FORM = 0x00010000, 
    SET_FORM = 0x00020000, 
    DELETE_FORM = 0x00040000, 
    FORM = 0x00070000, 
    ADD_PORT = 0x00100000, 
    CONFIGURE_PORT = 0x00200000, 
    DELETE_PORT = 0x00400000, 
    PORT = 0x00700000, 
    ADD_PRINT_PROCESSOR = 0x01000000, 
    DELETE_PRINT_PROCESSOR = 0x04000000, 
    PRINT_PROCESSOR = 0x07000000, 
    ADD_PRINTER_DRIVER = 0x10000000, 
    SET_PRINTER_DRIVER = 0x20000000, 
    DELETE_PRINTER_DRIVER = 0x40000000, 
    PRINTER_DRIVER = 0x70000000, 
    TIMEOUT = 0x80000000, 
    ALL = 0x7777FFFF 
} 

回答

相關問題