मैं यूएसबी सम्मिलन/निष्कासन का पता लगाने पर काम कर रहा हूं। मैंने CreateWindowEx() का उपयोग कर कोड लागू किया है, जो मेरी विंडो प्रक्रिया कॉलबैक के साथ एक WNCLASSEX गुजर रहा है। मेरे यूएसबी को डालने और हटाने पर, मुझे सफलतापूर्वक WM_DEVICECHANGE संदेश प्राप्त होता है, लेकिन wParam हमेशा DBT_DEVNODES_CHANGED पर सेट होता है।सी ++ Win32 WB_DEVICECHANGE पर DBT_DEVICEARRIVAL या DBT_DEVICEREMOVECOMPLETE प्राप्त नहीं कर रहा है
मुझे कभी भी DBT_DEVICEARRIVAL या DBT_DEVICEREMOVECOMPLETE नहीं मिलता है। मैं जो कुछ भी प्राप्त कर रहा हूं उसका उपयोग कर रहा हूं, लेकिन मुझे वास्तव में डिवाइस के आगमन और हटाने के बीच अंतर बताने में सक्षम होना चाहिए, ताकि मैं प्राप्त होने के आधार पर अलग-अलग कार्रवाइयां कर सकूं।
अभी, मुझे DBT_DEVNODES_CHANGED प्राप्त करने के बाद टाइमर डालना है, और फिर यह देखने के लिए परीक्षण करें कि सिस्टम पर कोई नया हटाने योग्य है या मेरी सूची में कोई भी नहीं है। मुझे यकीन है कि यह सही नहीं है, इसलिए मैंने सोचा कि मैं पूछूंगा। मैं टाइमर से छुटकारा पाने के लिए और इन दो संदेशों को प्राप्त करने के लिए बहुत कुछ करना चाहूंगा। इससे मुझे बहुत कुछ करने में मदद मिलेगी जो मुझे करना है। कोई सुझाव?
नोट:: 2015/03/12: कोड वास्तविक GUID और DoRegisterDeviceInterfaceToHwnd की परिभाषा (दिखाने के लिए अद्यतन) समारोह
यहाँ कोड मैं कॉलबैक पंजीकरण के लिए है, और साथ ही कॉलबैक ही है ।):
GUID WceusbshGUID = { 0x25dbce51, 0x6c8f, 0x4a72, 0x8a,0x6d,0xb5,0x4c,0x2b,0x4f,0xc8,0x35 };
//GUID WusbrawGUID = {0xa5dcbf10, 0x6530, 0x11d2, 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed };
//GUID WusbGUID = {0x88BAE032, 0x5A81, 0x49f0, 0xBC, 0x3D, 0xA4, 0xFF, 0x13, 0x82, 0x16, 0xD6 };
INT_PTR WINAPI WinProcCallback(HWND __hWnd, UINT message, WPARAM wParam, LPARAM lParam);
BOOL DoRegisterDeviceInterfaceToHwnd(GUID InterfaceClassGuid, HWND __hWnd, HDEVNOTIFY *hDeviceNotify);
bool UsbController::startNotifyUsbAddedRemoved(QString &errmsg)
{
WNDCLASSEX wndClass;
wndClass.cbSize = sizeof(wndClass);
wndClass.style = 0;
wndClass.hInstance = reinterpret_cast<HINSTANCE>(GetModuleHandle(0));
wndClass.lpfnWndProc = reinterpret_cast<WNDPROC>(WinProcCallback);
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.hIcon = LoadIcon(0, IDI_APPLICATION);
wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wndClass.hCursor = LoadCursor(0, IDC_ARROW);
wndClass.lpszClassName = WND_CLASS_NAME;
wndClass.lpszMenuName = NULL;
wndClass.hIconSm = LoadIcon(0, IDI_APPLICATION);
if (!RegisterClassEx(&wndClass))
{
FormatErrorMsg("RegisterClassEx: ", errmsg);
return false;
}
HINSTANCE hInstance = (HINSTANCE)::GetModuleHandle(NULL);
__hWnd = CreateWindowEx(
WS_EX_CLIENTEDGE | WS_EX_APPWINDOW,
WND_CLASS_NAME,
WND_APP_NAME,
WS_OVERLAPPEDWINDOW, // style
CW_USEDEFAULT, 0,
0, 0,
NULL, NULL,
hInstance,
NULL);
if (__hWnd == NULL)
{
FormatErrorMsg("CreateWindowEx: ", errmsg);
return false;
}
return true;
}
INT_PTR WINAPI WinProcCallback(HWND __hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
LRESULT lRet = 1;
static HDEVNOTIFY hDeviceNotify;
static HWND hEditWnd;
static ULONGLONG msgCount = 0;
switch (message)
{
case WM_CREATE:
//
// This is the actual registration., In this example, registration
// should happen only once, at application startup when the window
// is created.
//
// If you were using a service, you would put this in your main code
// path as part of your service initialization.
//
if (! DoRegisterDeviceInterfaceToHwnd(WceusbshGUID, __hWnd, &hDeviceNotify))
{
// Terminate on failure.
//ErrorHandler(TEXT("DoRegisterDeviceInterfaceToHwnd"));
ExitProcess(1);
}
//
// Make the child window for output.
//
hEditWnd = CreateWindow(TEXT("EDIT"),// predefined class
NULL, // no window title
WS_CHILD | WS_VISIBLE | WS_VSCROLL |
ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,
0, 0, 0, 0, // set size in WM_SIZE message
__hWnd, // parent window
(HMENU)1, // edit control ID
(HINSTANCE) GetWindowLong(__hWnd, GWL_HINSTANCE),
NULL); // pointer not needed
if (hEditWnd == NULL)
{
// Terminate on failure.
ExitProcess(1);
}
// Add text to the window.
SendMessage(hEditWnd, WM_SETTEXT, 0,
(LPARAM)TEXT("Registered for USB device notification...\n"));
break;
case WM_SETFOCUS:
SetFocus(hEditWnd);
break;
case WM_SIZE:
// Make the edit control the size of the window's client area.
MoveWindow(hEditWnd,
0, 0, // starting x- and y-coordinates
LOWORD(lParam), // width of client area
HIWORD(lParam), // height of client area
TRUE); // repaint window
break;
case WM_DEVICECHANGE:
{
//
// This is the actual message from the interface via Windows messaging.
// This code includes some additional decoding for this particular device type
// and some common validation checks.
//
// Note that not all devices utilize these optional parameters in the same
// way. Refer to the extended information for your particular device type
// specified by your GUID.
//
// Output some messages to the window.
UsbController *pusbctl;
switch (wParam)
{
case DBT_DEVICEARRIVAL:
msgCount++;
pusbctl = UsbController::instance();
pusbctl->signalDeviceArrival();
break;
case DBT_DEVICEREMOVECOMPLETE:
msgCount++;
pusbctl = UsbController::instance();
pusbctl->signalDeviceRemoval();
break;
case DBT_DEVNODES_CHANGED:
msgCount++;
pusbctl = UsbController::instance();
pusbctl->signalDeviceAddedRemoved();
break;
default:
msgCount++;
break;
}
}
break;
default:
// Send all other messages on to the default windows handler.
lRet = DefWindowProc(__hWnd, message, wParam, lParam);
break;
}
return lRet;
}
BOOL DoRegisterDeviceInterfaceToHwnd(GUID InterfaceClassGuid, HWND __hWnd, HDEVNOTIFY *hDeviceNotify)
{
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
ZeroMemory(&NotificationFilter, sizeof(NotificationFilter));
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
//NotificationFilter.dbcc_devicetype = DEVICE_NOTIFY_ALL_INTERFACE_CLASSES;
NotificationFilter.dbcc_classguid = InterfaceClassGuid;
*hDeviceNotify = RegisterDeviceNotification(
__hWnd, // events recipient
&NotificationFilter, // type of device
DEVICE_NOTIFY_WINDOW_HANDLE // type of recipient handle
);
if (NULL == *hDeviceNotify)
{
return FALSE;
}
return TRUE;
}
क्या आपने https://msdn.microsoft.com/en-us/library/windows/desktop/aa363215(v=vs.85).aspx देखा था?यह कहता है कि आपको मीडिया आगमन अधिसूचनाएं प्राप्त करने के लिए वास्तव में पंजीकरण करने की आवश्यकता नहीं है। मुझे आश्चर्य है कि यदि आप ** ** ** पंजीकरण कर रहे हैं तो यह तथ्य किसी तरह से हस्तक्षेप कर सकता है। –
हम्म, मेरी क्रिस्टल बॉल कहती है कि आप इसे प्रोग्रामर के तरीके से कर रहे हैं, बस "सुरक्षित रूप से हार्डवेयर निकालें" के माध्यम से बिना डिवाइस को झटके कर रहे हैं। और फिर आशा करें कि विंडोज दूसरे अनुमान लगा सकता है कि क्या हो सकता है। अच्छा, ऐसा हुआ, यह आपको इसके बारे में बताया। –
वास्तव में, मैंने निश्चित रूप से "सुरक्षित रूप से हार्डवेयर निकालें" प्रक्रिया की है। अधिसूचना जो मैं करता हूं वहां 7 का मान होता है, जो कि DBT_DEVNODES_CHANGED है। मुझे उस क्रिया से आने वाले कई संदेश मिलते हैं (अभी तक डिवाइस को अपने स्लॉट से नहीं खींच लिया गया है), जिनमें से सभी का मूल्य 7 है। बेशक, जब मैं डिवाइस खींचता हूं, तो मुझे वही मान मिलता है। डिवाइस डालने के समान सटीक परिणाम हैं। मुझे कई संदेश मिलते हैं, और उनमें से सभी के पास DBT_DEVNODES_CHANGED के लिए मान 7 है। – bmahf