項目:延時關機和鎖屏
我目前devellop的應用程序,如果他離開(鎖屏或關機),他的工作場所,並留下了自己的智能卡在讀寫器向用戶發出警告。
我能夠通過使用WinAPI(WinSCard.dll
)檢測smarcard是否在讀卡器中。
問題:
我讀(糾正我,如果這是錯誤的),它是不可能爲應用程序延遲鎖屏,所以我目前專注於延遲關機。
我現在面臨的問題是我需要延遲正在進行的關機,以警告用戶他離開了他的智能卡。
我嘗試使用ShutdownBlockReasonCreate
來延遲關機至少5秒Windows很慷慨地讓我。這個想法是,如果用戶刪除他的智能卡,我的應用程序將調用ShutdownBlockReasonDestroy
繼續關閉。
我實現了兩個方法,像這樣:
[DllImport("User32.dll", EntryPoint = "ShutdownBlockReasonCreate",
CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern bool ShutdownBlockReasonCreate(
[In()]IntPtr wndHandle,
[In()]string reason);
[DllImport("User32.dll", EntryPoint = "ShutdownBlockReasonDestroy",
CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern bool ShutdownBlockReasonDestroy(
[In()]IntPtr wndHandle);
而且我用GetLastError
來檢查,我以這種方式實現的錯誤:
[DllImport("Kernel32.dll", EntryPoint = "GetLastError",
CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern int GetLastError();
現在奇怪的是,如果我創建原因
WinAPIMethoden.ShutdownBlockReasonCreate(
new WindowInteropHelper(Application.Current.MainWindow).Handle,
"Smartcard still in reader!");
然後顯示錯誤
MessageBox.Show(WinAPIMethoden.GetLastError().ToString("X"));
它顯示0代表ERROR_SUCCESS
。
到目前爲止,一切似乎都很棒。 現在,如果我嘗試關閉PC,則沒有任何跡象表明我的應用程序要求現在不要關閉PC。
問:
什麼我做錯了,這樣ShutdownBlockReasonCreate
按預期不起作用?
或者是否有更好的方法來防止用戶關閉電腦,如果他的智能卡仍處於阻止他在啓動關機的同時他的卡片處於或類似的狀態?
TL;博士:
我試圖阻止關閉,而用戶自己在智能卡讀卡器。 我使用ShutdownBlockReasonCreate
,但它似乎沒有工作,雖然沒有錯誤。
解決方案:
接受的答案使我的問題的解決方案。
您必須創建容器原因並訂閱SystemEvents.SessionEnding
的處理程序。 此處理程序,然後必須設置e.Cancel
到true
void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
{
if (mgr.state == SmartcardState.Inserted)
{
e.Cancel = true;
}
}
要在關機執行PROGRAMM我把它addet使用gpendit.msc
關機腳本。 然後程序在所有程序終止後執行。看起來很奇怪,但做這項工作。
的[ShutdownBlockReasonCreate]的文檔(HTTP ://msdn.microsoft.com/en-us/library/windows/desktop/aa376877( v = vs.85).aspx)聲明「如果調用成功,返回值不爲零」。請不要僅僅調用該函數,而是立即分配返回值,看看會發生什麼。 – Alexander
@Alexander返回非零,所以這不是問題 – mgttlinger