【问题标题】:Silverlight 5 Get Usercontrol's handleSilverlight 5 获取用户控件的句柄
【发布时间】:2014-02-06 16:30:15
【问题描述】:

我正在尝试进行 PInvoke 调用以注册任何 USB 设备连接通知。

[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中获取用户控件的句柄?

【问题讨论】:

  • 是什么让您决定使用Pack=1?你确定这是正确的吗?

标签: c# .net silverlight user-controls pinvoke


【解决方案1】:

Silverlight 与 WPF 不同,不公开窗口句柄。但是,如果您足够努力,您可以找到窗户的把手。这个article 描述了这个方法。本质上,您调用FindWindow 函数来获取窗口句柄。

请记住,您不会获得用户控件的句柄,因为在 Silverlight 下只有顶级窗口具有句柄。 Silverlight 控件没有窗口化。

顺便说一句,你确定你的结构是打包好的吗?这将是非常不寻常的。

【讨论】:

  • 这是从工作库中获得的代码的 sn-p,所以我假设你的最后一个问题是肯定的。
  • 这还不够证据。它可能会偶然起作用。也许打包和对齐的结构恰好具有相同的布局。除非本机代码明确打包,否则您应该打包。
  • 据我所知dbt.h,该结构没有打包。碰巧没有填充,所以你无法区分。我建议你删除Pack=1
猜你喜欢
  • 2011-06-12
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多