GetMessage在我的MessageWindow中没有收到WM_DEVICECHANGE

本文关键字:WM DEVICECHANGE 我的 MessageWindow GetMessage | 更新日期: 2023-09-27 17:50:25

我正在尝试使用消息窗口在后台获取WM_DEVICECHANGE。我从pinvoke.com获得的所有Windows API方法都测试了它们的工作。我使用xbox 360控制器和罗技G35耳机来测试代码,但我从未得到WM_DEVICECHANGE。

代码如下:

//Creats Message windwos Win32Core.HWND_MESSAGE=-3
IntPtr hMessageWindow = Win32Core.CreateWindowEx(0, "static", "", 0, 0, 0, 0, 0, Win32Core.HWND_MESSAGE, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
//creat and populate the DEV_BROADCAST_DEVICEINTERFACE struct
DEV_BROADCAST_DEVICEINTERFACE sDeviceFilter = new DEV_BROADCAST_DEVICEINTERFACE();
sDeviceFilter.dbcc_devicetype = (int)DBT_DEVTYP_DEVICEINTERFACE; //DBT_DEVTYP_DEVICEINTERFACE = 0x00000005
sDeviceFilter.dbcc_reserved = 0;
//sDeviceFilter.dbcc_classguid = ; irelevant becouse i am using DEVICE_NOTIFY_ALL_INTERFACE_CLASSES
sDeviceFilter.dbcc_name = "EpicName'0";
sDeviceFilter.dbcc_size = Marshal.SizeOf(sDeviceFilter);
//Marshel sDeviceFilter to hDeviceFilter pointer
IntPtr hDeviceFilter = Marshal.AllocHGlobal(sDeviceFilter.dbcc_size);
Marshal.StructureToPtr(sDeviceFilter, hDeviceFilter, false);
//Register for WM_DEVICECHANGE   DEVICE_NOTIFY_WINDOW_HANDLE =0x00000000 , DEVICE_NOTIFY_ALL_INTERFACE_CLASSES = 0x00000004
//The RegisterDeviceNotification Returns some non 0 value 
IntPtr hDeviceNotification = Win32Core.RegisterDeviceNotification(hMessageWindow, hDeviceFilter, DEVICE_NOTIFY_WINDOW_HANDLE | DEVICE_NOTIFY_ALL_INTERFACE_CLASSES);
//Message pump
MSG sMsg = new MSG();
while (true)
{
    if (Win32Core.GetMessage(out sMsg, hMessageWindow, 0, 0))
    {
        if (sMsg.message == (int)WM.WM_DEVICECHANGE)
        {
            //Never gets here
        }
    }
    Win32Core.DispatchMessage(ref sMsg);
    sMsg = new MSG();
}
//structs
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct DEV_BROADCAST_DEVICEINTERFACE
{
    public int dbcc_size;
    public int dbcc_devicetype;
    public int dbcc_reserved;
    public Guid dbcc_classguid;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]
    public string dbcc_name;
} 

GetMessage在我的MessageWindow中没有收到WM_DEVICECHANGE

这是一条未排队的消息,因此它不会通过消息队列到达。你不能把它叫做GetMessage()。而是直接传递到窗口。我建议您阅读Windows消息的MSDN概述主题:关于消息和消息队列。

WM_DEVICECHANGE的文档说明了消息是如何传递的,如下所示:

窗口通过接收此消息它的WindowProc函数

您需要重写WndProc()方法来接收此消息。

我认为您应该能够从System.Windows.Forms.Control派生并覆盖WndProc()以获得此通知。更重要的是,你不需要在后台线程中这样做。