我正在尋找一種方法來檢測在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
}