2014-02-06 47 views
0

我正在嘗試進行PInvoke調用以註冊任何USB設備連接通知。Silverlight 5獲取Usercontrol的句柄

[DllImport("user32.dll", SetLastError = true)] 
protected static extern IntPtr RegisterDeviceNotification(IntPtr hwnd, DeviceBroadcastInterface oInterface, uint nFlags); 

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)] 
public class DeviceBroadcastInterface 
{ 
    public int Size; 
    public int DeviceType; 
    public int Reserved; 
    public Guid ClassGuid; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] 
    public string Name; 
} 

窗口的句柄通常從Winforms應用程序的OnHandleCreated中獲得,用於進行這樣的PInvoke調用。有沒有辦法在silverlight 5中獲得usercontrol的句柄?

+0

是什麼讓你決定使用'Pack = 1'?你確定這是正確的嗎? –

回答

1

與WPF不同,Silverlight不公開窗口句柄。但是,如果您足夠努力,您可以找到窗口的句柄。這個article描述了這個方法。基本上,您可以調用FindWindow函數來獲取窗口句柄。

請記住,您不會得到用戶控件的句柄,因爲只有頂級窗口在Silverlight下才有句柄。 Silverlight控件沒有窗口。

順便說一句,你確定你的結構是封裝的嗎?這將是非常不尋常的。

+0

這是從工作庫中獲得的代碼片段,所以我對你的最後一個問題做出了肯定的回答。 – l46kok

+0

這不足以證明。這可能是偶然的。也許打包和對齊碰巧有這個結構相同的佈局。除非本地代碼明確包裝你應該打包。 –

+0

就我可以從'dbt.h'中得知的結構來說,這個結構並沒有打包。恰巧沒有填充,所以你不能分辨。我建議你刪除'Pack = 1'。 –