Incase anybody is interested in this code here it is:
Code:
// Takes Gtk window handle and overrides WindowProc to listen on Hardware change messages
// Currently works on MSVC++ 2005 with Gtkmm and Gtk+
#include <gtk/gtk.h>
#include <gtkmm/main.h>
#include <gtkmm/label.h>
#include <gtkmm/window.h>
#include <gdk/gdkwin32.h>
#include <windows.h>
#include <dbt.h>
#include <iostream>
// Global -- Original Window Procedure
WNDPROC OldWinProc = NULL;
int DeviceArrival = 0;
int DeviceRemoval = 0;
// =================================================================================
// PROTOTYPE FUNCTIONS =============================================================
// =================================================================================
// Returns a Win32 HWND from the Gtk::Window
// requires <gtk/gtk.h>, <gtkmm/window.h>, <windows.h>, and <gdk/gdkwin32.h> headers
HWND gtkmm_win32_get_handle(Gtk::Window *Window);
int override_window_procedure(HWND & hWnd);
// New Window Procedure
LRESULT CALLBACK NewWndProc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
// =================================================================================
// END PROTOTYPE FUNCTIONS =========================================================
// =================================================================================
int main(int argc, char *argv[])
{
/*****************************************************************
GtkWidget *window;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "HWND TEST");
gtk_widget_show_all(window);
HWND hWnd = (HWND) gdk_win32_drawable_get_handle(window->window);
if(!override_window_procedure(hWnd) )
{
std::cout << "override failed\n";
std::cout << "GetLastError(): " << GetLastError() << "\n";
}
gtk_main();
******************************************************************/
Gtk::Main kit(argc, argv);
Gtk::Window *window = new Gtk::Window();
window->set_title("Hello World");
window->show_all();
HWND hWnd = gtkmm_win32_get_handle(window);
if(!override_window_procedure(hWnd) )
{
std::cout << "override failed\n";
std::cout << "GetLastError(): " << GetLastError() << "\n";
exit(-1);
}
Gtk::Main::run(*window);
return 0;
}
// =================================================================================
LRESULT CALLBACK NewWndProc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
if (uMsg == WM_DEVICECHANGE)
{
switch (wParam)
{
case DBT_DEVICEARRIVAL: std::cout << "Device New: " << ++DeviceArrival << "\n";
break;
case DBT_DEVICEREMOVECOMPLETE: std::cout << "Device Gone: " << ++DeviceRemoval << "\n";
break;
};
}
return CallWindowProc(OldWinProc,hwnd,uMsg,wParam,lParam);
}
inline HWND gtkmm_win32_get_handle(Gtk::Window * Window)
{
// window must be visible to grab gobj()
if (!Window->is_visible())
Window->show_all();
return static_cast<HWND>(gdk_win32_drawable_get_handle(Window->get_window()->gobj()) );
}
int override_window_procedure(HWND & hWnd)
{
OldWinProc = (WNDPROC)GetWindowLong(hWnd,GWL_WNDPROC);
if(!OldWinProc) return (int)OldWinProc;
return SetWindowLong(hWnd,GWL_WNDPROC,(LONG)(WNDPROC)NewWndProc);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
return main(__argc, __argv);
}