2012-01-01 43 views
2

當屏幕保護程序打開/關閉時,我想要接收SENS事件。我的代碼是基於this文章:在.NET中接收SENS事件

private static readonly string GUID = "{" + typeof(ScreensaverHandler).GUID.ToString() + "}"; 

[ComImport, Guid("4E14FBA2-2E22-11D1-9964-00C04FBBB345")] 
private class EventSystem { } 

[ComImport, Guid("7542E960-79C7-11D1-88F9-0080C7D771BF")] 
private class EventSubcription { } 

[ComImport, Guid("AB944620-79C6-11d1-88F9-0080C7D771BF")] 
private class EventPublisher { } 

[ComImport, Guid("cdbec9c0-7a68-11d1-88f9-0080c7d771bf")] 
private class EventClass { } 

public ScreensaverHandler() { 
    IEventSystem es = (IEventSystem) new EventSystem(); 
    IEventSubscription sub = (IEventSubscription) new EventSubcription(); 
    sub.Description = "description"; 
    sub.SubscriptionName = "subscriptionname"; 
    sub.SubscriptionID = GUID; 
    sub.InterfaceID = GetInterfaceGuid(typeof(SensEvents.ISensLogon)); 
    sub.SubscriberInterface = this; // implements SensEvents.ISensLogon 
    es.Store("EventSystem.EventSubscription", sub); 
} 

private static string GetInterfaceGuid(Type type) { 
    object[] attributes = type.GetCustomAttributes(typeof(GuidAttribute), true); 
    return "{" + ((GuidAttribute)attributes[0]).Value + "}"; 
} 

的問題是,es.Store投用Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

+1

什麼是操作系統?如果Vista或7,那麼你可能想要以管理員權限執行此代碼(VS作爲管理員權限或可執行文件本身的管理員權限) – 2012-01-01 05:11:57

+0

@Ron對不起,應該提到一個。 Windows 7和是與管理員權限運行修復它 – Voo 2012-01-01 05:20:29

回答

2

一個System.UnauthorizedAccessException的你可能會運行到的this Microsoft security bulletin副作用。您可能需要放鬆事件系統dll的安全限制。

我會,如果你還沒有,首先試試這個作爲管理員。我只是將Win Server 2008上的代碼作爲完整的管理員進行測試,沒有任何問題。

另外,在.Net的事件系統中有另一篇非常好的文章,文章號碼爲CodeProject

+0

你是完全正確的,運行代碼作爲管理員解決問題 - 不認爲我需要管理員權限來接收事件(並且無法找到任何提及文件..嘆氣),但例外應該給我一個線索。 – Voo 2012-01-01 05:18:25