windows registration for device notif(thru hidden app) - windows doesnt need update now

This commit is contained in:
David Kocik 2019-12-06 16:51:04 +01:00
parent b386eb45dc
commit 8f069e2d47
3 changed files with 40 additions and 73 deletions

View File

@ -273,7 +273,7 @@ bool GUI_App::on_init_inner()
this->obj_manipul()->update_if_dirty(); this->obj_manipul()->update_if_dirty();
RemovableDriveManager::get_instance().update(wxGetLocalTime()); //RemovableDriveManager::get_instance().update(wxGetLocalTime());
// Preset updating & Configwizard are done after the above initializations, // Preset updating & Configwizard are done after the above initializations,
@ -303,6 +303,7 @@ bool GUI_App::on_init_inner()
preset_updater->slic3r_update_notify(); preset_updater->slic3r_update_notify();
preset_updater->sync(preset_bundle); preset_updater->sync(preset_bundle);
}); });
RemovableDriveManager::get_instance().init();
} }
}); });

View File

@ -8,9 +8,9 @@
#include <winioctl.h> #include <winioctl.h>
#include <shlwapi.h> #include <shlwapi.h>
//#include <Dbt.h> #include <Dbt.h>
//GUID WceusbshGUID = { 0x25dbce51, 0x6c8f, 0x4a72, GUID WceusbshGUID = { 0x25dbce51, 0x6c8f, 0x4a72,
// 0x8a,0x6d,0xb5,0x4c,0x2b,0x4f,0xc8,0x35 }; 0x8a,0x6d,0xb5,0x4c,0x2b,0x4f,0xc8,0x35 };
#else #else
//linux includes //linux includes
@ -29,7 +29,7 @@ namespace GUI {
#if _WIN32 #if _WIN32
//INT_PTR WINAPI WinProcCallback(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); INT_PTR WINAPI WinProcCallback(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
void RemovableDriveManager::search_for_drives() void RemovableDriveManager::search_for_drives()
{ {
m_current_drives.clear(); m_current_drives.clear();
@ -136,13 +136,8 @@ std::string RemovableDriveManager::get_drive_from_path(const std::string& path)
} }
void RemovableDriveManager::register_window() void RemovableDriveManager::register_window()
{ {
/*
std::cout << "Registering for device notification\n"; std::cout << "Registering for device notification\n";
WNDCLASSEX wndClass; WNDCLASSEX wndClass;
wndClass.cbSize = sizeof(WNDCLASSEX); wndClass.cbSize = sizeof(WNDCLASSEX);
wndClass.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; wndClass.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
wndClass.hInstance = reinterpret_cast<HINSTANCE>(GetModuleHandle(0)); wndClass.hInstance = reinterpret_cast<HINSTANCE>(GetModuleHandle(0));
@ -155,34 +150,41 @@ void RemovableDriveManager::register_window()
wndClass.lpszClassName = L"PrusaSlicer_aux_class"; wndClass.lpszClassName = L"PrusaSlicer_aux_class";
wndClass.lpszMenuName = NULL; wndClass.lpszMenuName = NULL;
wndClass.hIconSm = wndClass.hIcon; wndClass.hIconSm = wndClass.hIcon;
if(!RegisterClassEx(&wndClass))
HINSTANCE hInstanceExe = GetModuleHandle(NULL); {
DWORD err = GetLastError();
return;
}
HWND hWnd = CreateWindowEx( HWND hWnd = CreateWindowEx(
WS_EX_CLIENTEDGE | WS_EX_APPWINDOW, WS_EX_NOACTIVATE,
L"PrusaSlicer_aux_class", L"PrusaSlicer_aux_class",
L"PrusaSlicer_aux_wnd", L"PrusaSlicer_aux_wnd",
WS_OVERLAPPEDWINDOW, // style WS_DISABLED, // style
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
640, 480, 640, 480,
NULL, NULL, NULL, NULL,
hInstanceExe, GetModuleHandle(NULL),
NULL); NULL);
*/ if(hWnd == NULL)
{
DWORD err = GetLastError();
}
//ShowWindow(hWnd, SW_SHOWNORMAL);
UpdateWindow(hWnd);
} }
/*
INT_PTR WINAPI WinProcCallback(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) INT_PTR WINAPI WinProcCallback(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{ {
LRESULT lRet = 1; LRESULT lRet = 1;
static HDEVNOTIFY hDeviceNotify; static HDEVNOTIFY hDeviceNotify;
static HWND hEditWnd; static HWND hEditWnd;
static ULONGLONG msgCount = 0; static ULONGLONG msgCount = 0;
switch (message) switch (message)
{ {
case WM_CREATE: case WM_CREATE:
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter; DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
ZeroMemory(&NotificationFilter, sizeof(NotificationFilter)); ZeroMemory(&NotificationFilter, sizeof(NotificationFilter));
@ -196,55 +198,13 @@ INT_PTR WINAPI WinProcCallback(HWND hWnd, UINT message, WPARAM wParam, LPARAM lP
DEVICE_NOTIFY_WINDOW_HANDLE // type of recipient handle DEVICE_NOTIFY_WINDOW_HANDLE // type of recipient handle
); );
break; break;
case WM_DEVICECHANGE: case WM_DEVICECHANGE:
{ {
std::cout << "WM_DEVICECHANGE\n"; if(wParam == DBT_DEVICEREMOVECOMPLETE)
/*
// 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.
//
PDEV_BROADCAST_DEVICEINTERFACE b = (PDEV_BROADCAST_DEVICEINTERFACE)lParam;
TCHAR strBuff[256];
// Output some messages to the window.
switch (wParam)
{ {
case DBT_DEVICEARRIVAL: std::cout << "WM_DEVICECHANGE\n";
msgCount++; RemovableDriveManager::get_instance().on_drive_removed_callback();
StringCchPrintf(
strBuff, 256,
TEXT("Message %d: DBT_DEVICEARRIVAL\n"), msgCount);
break;
case DBT_DEVICEREMOVECOMPLETE:
msgCount++;
StringCchPrintf(
strBuff, 256,
TEXT("Message %d: DBT_DEVICEREMOVECOMPLETE\n"), msgCount);
break;
case DBT_DEVNODES_CHANGED:
msgCount++;
StringCchPrintf(
strBuff, 256,
TEXT("Message %d: DBT_DEVNODES_CHANGED\n"), msgCount);
break;
default:
msgCount++;
StringCchPrintf(
strBuff, 256,
TEXT("Message %d: WM_DEVICECHANGE message received, value %d unhandled.\n"),
msgCount, wParam);
break;
} }
OutputMessage(hEditWnd, wParam, (LPARAM)strBuff);
/
} }
break; break;
default: default:
@ -254,7 +214,7 @@ INT_PTR WINAPI WinProcCallback(HWND hWnd, UINT message, WPARAM wParam, LPARAM lP
} }
return lRet; return lRet;
} }
*/
#else #else
void RemovableDriveManager::search_for_drives() void RemovableDriveManager::search_for_drives()
{ {
@ -420,15 +380,16 @@ std::string RemovableDriveManager::get_drive_from_path(const std::string& path)
return ""; return "";
} }
#endif #endif
void RemovableDriveManager::init()
{
add_callback([](void) { RemovableDriveManager::get_instance().print(); });
#if _WIN32
register_window();
#endif
update();
}
bool RemovableDriveManager::update(const long time) bool RemovableDriveManager::update(const long time)
{ {
if(m_last_update == 0)
{
add_callback([](void) { RemovableDriveManager::get_instance().print(); });
#if _WIN32
//register_window();
#endif
}
if(time != 0) //time = 0 is forced update if(time != 0) //time = 0 is forced update
{ {
long diff = m_last_update - time; long diff = m_last_update - time;
@ -442,7 +403,6 @@ bool RemovableDriveManager::update(const long time)
} }
search_for_drives(); search_for_drives();
check_and_notify(); check_and_notify();
//eject_drive(m_current_drives.back().path);
return !m_current_drives.empty(); return !m_current_drives.empty();
} }
@ -523,6 +483,10 @@ void RemovableDriveManager::reset_last_save_path()
{ {
m_last_save_path = ""; m_last_save_path = "";
} }
void RemovableDriveManager::on_drive_removed_callback()
{
update();
}
void RemovableDriveManager::print() void RemovableDriveManager::print()
{ {
//std::cout << "Removed Device: "<<(int)is_last_drive_removed()<<"\n"; //std::cout << "Removed Device: "<<(int)is_last_drive_removed()<<"\n";

View File

@ -24,6 +24,7 @@ public:
void operator=(RemovableDriveManager const&) = delete; void operator=(RemovableDriveManager const&) = delete;
//update() searches for removable devices, returns false if empty. //update() searches for removable devices, returns false if empty.
void init();
bool update(const long time = 0); //time = 0 is forced update, time expects wxGetLocalTime() bool update(const long time = 0); //time = 0 is forced update, time expects wxGetLocalTime()
bool is_drive_mounted(const std::string &path); bool is_drive_mounted(const std::string &path);
void eject_drive(const std::string &path); void eject_drive(const std::string &path);
@ -36,6 +37,7 @@ public:
bool is_last_drive_removed(); //if we dont need info about this drive, call reset_last_save_path(); bool is_last_drive_removed(); //if we dont need info about this drive, call reset_last_save_path();
bool is_last_drive_removed_with_update(const long time = 0); // param as update() bool is_last_drive_removed_with_update(const long time = 0); // param as update()
void reset_last_save_path(); void reset_last_save_path();
void on_drive_removed_callback();
void print(); void print();
private: private:
RemovableDriveManager():m_drives_count(0),m_last_update(0),m_last_save_path(""){} RemovableDriveManager():m_drives_count(0),m_last_update(0),m_last_save_path(""){}