Gowers Temat założony przez niniejszego użytkownika |
Wykorzystanie funkcji WindowProc() » 2018-07-08 17:35:15 Witam, chcę napisać program na windowsie, który wypala pliki iso na pendrivie przy użyciu bibliotek QT. Za pomocą QTimera chcę, aby program sprawdzał cały czas czy pojawił się nowy pendrive lub został usunięty jakiś bieżący i żeby dostępne pendrivy były widoczne w comboboxie(ma to działać w taki sposób jak w programie UltraISO). Chciałem to zrobić na takiej zasadzie, że sprawdzenie dodania/usunięcia pendrive'a oraz aktualizacja w comboboxie nastąpi wtedy, gdy program dostanie taki komunikat od systemu. Jak czytałem służy do tego windowsowa funkcja WindowProc() w której jako jeden z argumentów muszę podać identyfikator WM_DEVICECHANGE, czyli "DBT_DEVNODES_CHANGED" co właśnie odpowiada komunikatowi o pojawieniu się/usunięciu jakiegoś urządzenia. LRESULT CALLBACK WindowProc( _In_ HWND hwnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ); https://docs.microsoft.com/pl-pl/windows/desktop/DevIO/wm-devicechangehttps://msdn.microsoft.com/library/windows/desktop/ms633573Czy w dobry sposób myślę? To jest właściwa droga na rozwiązanie mojego problemu? Jeśli tak to w jaki sposób mogę użyć tej funkcji, bo nie umiem jej wykorzystać. Googlowanie mi za wiele nie pomogło. |
|
pekfos |
» 2018-07-08 17:57:01 Jak czytałem służy do tego windowsowa funkcja WindowProc() w której jako jeden z argumentów muszę podać identyfikator WM_DEVICECHANGE, czyli "DBT_DEVNODES_CHANGED" co właśnie odpowiada komunikatowi o pojawieniu się/usunięciu jakiegoś urządzenia. |
To źle przeczytałeś, bo jest zupełnie odwrotnie. Nie jest to windowsowa funkcja, nigdy tej funkcji nie wywołujesz, ani niczego do niej nie przekazujesz. Przykład jej "użycia" znajdziesz tu: Podstawy WinAPIPrzy czym, nie piszesz aplikacji okienkowej w WinAPI, więc raczej się nie przyda. Powinieneś poszukać, jak w Qt być informowanym o komunikatach systemowych. |
|
Gowers Temat założony przez niniejszego użytkownika |
» 2018-07-08 18:50:34 Dzięki za pomoc, to już wiem dlaczego nie miałem pojęcia jak tego użyć :) |
|
Monika90 |
» 2018-07-08 19:01:14 W Qt zamiast WindowProc jest funkcja nativeEvent I nawet mam przykład użycia #include <QFrame> #include <windows.h>
class Native : public QFrame { Q_OBJECT bool nativeEvent( const QByteArray &, void * message, long * result ) override { auto & msg = * static_cast < const MSG *>( message ); if( msg.message == WM_DEVICECHANGE ) { } return false; } };
|
|
Gowers Temat założony przez niniejszego użytkownika |
» 2018-07-09 17:29:19 Dziękuję za pomoc, ale nie wiem jednak w jaki sposób ją wykorzystać. Dostanę jakąś podpowiedź? Chciałbym te wywołanie wrzucić do funkcji, która jest cyklicznie powtarzana przez program, ale nie widzę w jaki sposób ją tam umieścić, chodzi mi o umieszczenie argumentów i ogólne używanie tego typu funkcji. Jest to dla mnie całkowita nowość i nie umiem sobie poradzić. |
|
pekfos |
» 2018-07-09 18:21:34 Tej funkcji też się nie wywołuje. Zostanie wywołana automatycznie gdy nastąpi zdarzenie systemowe. |
|
Gowers Temat założony przez niniejszego użytkownika |
» 2018-07-09 18:27:12 Czyli to oznacza, że pojawienie się lub usunięcie jakiegoś pendrive'a powinno nadpisać mój textEdit? Bo na próbę tak chciałem zrobić, ale w ten sposób to nie działa. Czy brakuje tutaj jeszcze czegoś, aby funkcja była wywoływana przy pojawieniu się zdarzenia z pendrivem? ISO to moja główna klasa na której opiera się program. class Native : public QFrame , public ISO { Q_OBJECT bool nativeEvent( const QByteArray &, void * message, long * result ) override { auto & msg = * static_cast < const MSG *>( message ); if( msg.message == WM_DEVICECHANGE ) { ui.textEdit_wiadomosc->append( "Zmiana" ); } return false; } }; |
|
pekfos |
» 2018-07-09 18:42:56 Ten kod to przykład. Jak piszesz aplikację w Qt to masz klasę która dziedziczy po QFrame i tam powinieneś dodać metodę nativeEvent. |
|
« 1 » 2 |