Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wykorzystanie funkcji WindowProc()

Ostatnio zmodyfikowano 2018-07-22 23:05
Autor Wiadomość
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.

C/C++
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-devicechange
https://msdn.microsoft.com​/library/windows/desktop​/ms633573


Czy 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.
P-171783
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:
» Kurs WinAPI, C++ » PodstawyPodstawy WinAPI lekcja
Przy czym, nie piszesz aplikacji okienkowej w WinAPI, więc raczej się nie przyda. Powinieneś poszukać, jak w Qt być informowanym o komunikatach systemowych.
P-171784
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ć :)
P-171785
Monika90
» 2018-07-08 19:01:14
W Qt zamiast WindowProc jest funkcja nativeEvent

I nawet mam przykład użycia
C/C++
#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;
    }
};
P-171786
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ć.
P-171802
pekfos
» 2018-07-09 18:21:34
Tej funkcji też się nie wywołuje. Zostanie wywołana automatycznie gdy nastąpi zdarzenie systemowe.
P-171803
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.

C/C++
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;
    }
};
P-171804
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.
P-171805
« 1 » 2
  Strona 1 z 2 Następna strona