8

Qtアプリケーションが実行されているコンピューター(Windowsの場合)にUSBデバイスが接続されていることを知りたい。メインのQWidgetで、次のwinEventFilterように再実装しました。

bool winEventFilter ( MSG * msg, long * result ) {
    qDebug() << msg;
    return false;
}

USBデバイスを接続すると、qDebugが少なくとも何かを送信することを期待しますが、何も取得しません。

私はここでのプロセスを根本的に誤解していると思います-これは私の最初のQtアプリです!

4

3 に答える 3

6

あなたが見逃しているかもしれないのは、デバイス通知に登録するための呼び出しだと思います。これが同じことを行うために使用するコードですが、winEventFilterではなくQWidgetクラスのwinEvent()メソッドをオーバーライドします。

// Register for device connect notification
DEV_BROADCAST_DEVICEINTERFACE devInt;
ZeroMemory( &devInt, sizeof(devInt) );
devInt.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
devInt.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
devInt.dbcc_classguid = GUID_DEVINTERFACE_VOLUME;

m_hDeviceNotify =
    RegisterDeviceNotification( winId(), &devInt, DEVICE_NOTIFY_WINDOW_HANDLE );   
if(m_hDeviceNotify == NULL)
{
    qDebug() << "Failed to register device notification";
} // end if

注:ほとんどの場合DEV_BROADCAST_DEVICEINTERFACE、ニーズに合わせての値を変更する必要があります。

編集:このコードを使用するには、適切なヘッダーファイルをインクルードし、適切なセットアップを実行する必要があります。 DEV_BROADCAST_DEVICEINTERFACEDbt.hヘッダーを含める必要があります。また、このコードの焦点は、RegisterDeviceNotification関数にあります。情報はMSDNで入手できます

于 2009-05-12T15:39:03.243 に答える
2

私は同じ行に沿って作業していますが、C# で作業しています。

アプリケーションをシステムに登録する必要があります (RegisterHidNotification() 関数を見てください)。私の場合は次のようになります。

void RegisterHidNotification() //Register this application to recieve all USB device notices

        {
            BroadcastHeader dbi = new BroadcastHeader();
            int size = Marshal.SizeOf(dbi);
            dbi.Size = size;
            dbi.Type = DeviceType.DeviceInterface;
            **dbi.Classguid = GUID_DEVINTERFACE_USB_DEVICE**;
            dbi.Name = 0;
            IntPtr buffer = Marshal.AllocHGlobal(size);
            Marshal.StructureToPtr(dbi, buffer, true);
            IntPtr r = RegisterDeviceNotification(this.Handle, buffer, (int)DeviceEvents.regWindowHandle);
            if (r == IntPtr.Zero)
                statusLabel.Text = GetLastError().ToString();
        }`

関数の最も重要な部分は、太字で強調表示した (または少なくとも試みた) ビットです。定義:public Guid GUID_DEVINTERFACE_USB_DEVICE = new Guid("A5DCBF10-6530-11D2-901F-00C04FB951ED"); あなたのアプリケーションに適応できることを願っています。

于 2009-05-14T20:47:56.857 に答える