GetMessage не получает WM_DEVICECHANGE в моем MessageWindow - PullRequest
0 голосов
/ 19 апреля 2011

Я пытаюсь получить WM_DEVICECHANGE в фоновом режиме, используя окна сообщений.Все методы Windows API, которые я получил от pinvoke.com и протестировали, работают.Я использую контроллер xbox 360 для Windows и гарнитуру Logitech 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;
} 

1 Ответ

0 голосов
/ 19 апреля 2011

Это сообщение без очереди, поэтому оно не поступает через очередь сообщений.Вы не получите его, позвонив по номеру GetMessage().Скорее он доставляется прямо к окну.Я рекомендую прочитать раздел обзора MSDN для сообщений Windows: О сообщениях и очередях сообщений .

В документации для WM_DEVICECHANGE указано, как сообщение доставляется следующим образом:

Окно получает это сообщение через функцию WindowProc.

Вам необходимо переопределить метод WndProc(), чтобы получить это сообщение.

Я думаю,вы должны иметь возможность получить из System.Windows.Forms.Control и переопределить WndProc(), чтобы получить это уведомление.Более того, вам не нужно делать это в фоновом потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...