120

Un grand merci pour tout. Je verrai ça demain, parce que demain c'est la dernière journée de taf, et après ça ira mieux \o/

121

Folco (./114) :
Pourquoi quand j'écris ça :
bool NativeEventFilter::nativeEventFilter(const QByteArray& eventType, void* message, long*)
{
    if (eventType == "windows_dispatcher_MSG")
    {
        return true;
    }
    return false;
}
J'ai cette erreur :
NativeEventFilter.cpp:10: erreur : no match for 'operator==' (operand types are 'const QByteArray' and 'const char [23]')
Parce que QByteArray n'est probablement déclaré qu'en avance (suffisant si on n'utilise que des const QByteArray &) et le header QByteArray n'est pas inclus.
Par contre, si j'inclus <QLocalServer>, ça passe, operator== semble défini pour mes besoins (je me suis rendu compte de ça en googlant). Quelle est la solution propre, qui évite d'inclure un header random ?
#include <QByteArray>
EDIT -> Bon oubliez, ça marche sans que je comprenne pourquoi...
C'est quand-même mieux de comprendre pourquoi. smile Je suppose que ça marche parce que tu as inclus un header qui inclut <QByteArray>. (C'est très courant.)
Folco (./116) :
    // Install a native event filter and register a hotkey
    NativeEventFilter nef;
    filter = &nef;
    app.installNativeEventFilter(filter);
Attention, tu leakes un pointeur vers une variable locale, ce n'est généralement pas une bonne idée! Ça passe si tu es dans main (parce que dans ce cas, la variable locale va durer jusqu'à la fin du programme), mais n'essaie pas de faire ça dans une fonction qui retourne tout de suite.
[...] et qu'un thread d'interface je sais pas comment le trouver ^^
Avec Qt, par défaut, le thread d'interface est le thread principal.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

122

Merci bien. Je la connais en plus la classe QByte Array, je devais déjà être fatigué. Bon vivement ce soir ^^

Pour le pointeur, c'est en fait une chose que je fais couramment : une variable locale à dans main(), et une variable globale dans main.cpp, qui pointe sur ma variable globale.
C'est dangereux ? Je devrais avoir directement ma variable dans l'espace global, avec une allocation sur le tas ?

123

Ouais, tu te compliques la vie pour pas grand-chose, y'a pas besoin de ce genre de bidouilles pour une appli desktop tongue

Utilise des "vraies" variables globales, c'est plus simple et plus clair smile
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

124

Folco (./122) :
Pour le pointeur, c'est en fait une chose que je fais couramment : une variable locale à dans main(), et une variable globale dans main.cpp, qui pointe sur ma variable globale.C'est dangereux ? Je devrais avoir directement ma variable dans l'espace global, avec une allocation sur le tas ?
Comme je l'ai dit, dans main, ça passe (parce que cette fonction ne termine normalement qu'à la fin du programme), mais si tu fais ça dans une autre fonction, ça va foirer à 99%.

Et avec Qt, un autre risque concerne les QObjects: si tu as un QObject local et que tu détruis l'objet parent, ça va planter (parce que le système de QObject va essayer de libérer ton objet local et pouf!). Un QObject local devrait toujours avoir un parent nul (mais pour les QWidgets, ce n'est pas possible sauf pour les fenêtres, parce parent nul = fenêtre justement). Le plus sûr est de toujours allouer les QObjects avec new.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

125

Ok, merci Zerosquare pour le conseil, je vais le suivre.
Merci Kevin, je codais des vars en local par souci d'éviter l'overhead heap + perf, mais c'est probablement ridicule à cette échelle.

126

A cette échelle ça n'a aucun sens effectivement. Privilégie le code simple, et optimise uniquement quand tu constates que c'est lent, en profilant pour comprendre pourquoi c'est lent.
So much code to write, so little time.

127

Finalement, ça n'a pas que des avantages d'apprendre à coder sur de l'embarqué avec des ressources bienlimitées hehe

128

Bon j'y arrive décidément pas. PUTAING !!!!!!!!!!!!!!!! Il me manque plus que cette feature ! :@

Je résume :
dans main.cpp, j'installe le handler qui intercepte les évènements natifs :
NativeEventFilter* native_event_filter;

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    // Install a native event filter
    native_event_filter = new NativeEventFilter;
    app.installNativeEventFilter(native_event_filter);
(j'ai même bien suivi vos conseils sur les vars globales embarrassed)

Au passage, le code de l'event n'a pas changé :
bool NativeEventFilter::nativeEventFilter(const QByteArray& eventType, void* message, long*)
{
    if (eventType == "windows_dispatcher_MSG")
    {
        MSG* msg = static_cast<MSG*>(message);
        if (msg->message == WM_HOTKEY)
        {
            emit hotkeyPressed();
            return true;
        }
    }
    return false;
}
Et dans le constructeur de ma MainWindow, j'installe la hotkey. Du moins j'essaye, parce que ça a pas l'air de cartonner sad
    // Register an hotkey
    RegisterHotKey((HWND)winId(), 1, MOD_ALT | 0x4000, 0x42);
Et donc devant vos yeux ébahis, ben il ne se passe strictement rien. Nada. Que dalle.Malheureusement, j'ai pas de violon, sinon j'aurais essayé de pisser dedans, faute de mieux.

Donc je résume :
- j'ai le bon HWND normalement
- je sui dans le bon thread
- est-ce que tout simplement, c'est pas mon handler qui ne ressemble à rien ? Je suis allé faire un tour complet, et même plusieurs, sur le lien filé par Golden : https://msdn.microsoft.com/en-us/library/windows/desktop/ms644958%28v=vs.85%29.aspx

Bon déjà, j'ai du mal avec leurs types chelous (DWORD ?? double word, 4 octets ?), et ensuite ce code de MS montre qu'on teste MSG->message en entier, alors que la doc dit que le word supérieur est réservé. Déjà c'est pas terrible de partager l'instance d'un type entre user et système, mais là ils lisent ce membre comme si l'upper word était nul ( if (msg.message == WM_HOTKEY)).

Décidément, je suis perdu, mais depuis hier j'ai progressé. Auriez-vous encore des pistes svp ?

Merci d'avance. smile

129

Allez, pleure pas, on va te le trouver ton bug ^^

Déjà, que renvoie RegisterHotKey() ? (c'est pas bien de pas vérifier la valeur de retour des fonctions embarrassed)

Ensuite il faudrait vérifier si la fenêtre reçoit bien le message, mais je n'ai pas trouvé d'outil qui soit compatible Windows 7 64 bits...

Call : GoldenCrystal appelé(e) sur ce topic...

Une idée de programme qui ferait l'affaire ?
Spy++ ne semble dispo que dans les versions payantes de Visual Studio, et aucun des programmes similaires que j'ai testés (Winspector Spy, WinSpy++ et Window Detective) ne détecte de messages, même en les lançant en mode administrateur.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

130

Et quelques autres pistes en attendant :

- as-tu essayé d'exécuter ton appli en tant qu'administrateur ? Je ne sais pas si des applis non-admin peuvent définir des raccourcis claviers globaux (ce serait assez dangereux, on pourrait faire un keylogger avec ça)

- que se passe-t-il si tu remplaces emit hotkeyPressed(); par un truc qui ne dépend pas de Qt, genre MessageBeep(MB_OK); ?

- que se passe-t-il si tu testes un autre type de message ? Par exemple, dans if (msg->message == WM_HOTKEY), remplace WM_HOTKEY par WM_SIZE, et redimensionne ta fenêtre.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

131

Je pense que c'est pas très difficile d'intercepter les messages Windows d'un autre process, maintenant je me suis toujours basé sur Spy++ les rares fois où j'en ai eu besoin.
(Étape 1: Écrire dans une DLL un WindowProc pour sous-classer une fenêtre, Étape 2: Écrire du code pour injecter la dite DLL dans un process cible, Étape 3: Profit)
(Je ne précise bien sûr pas que le plus difficile dans tout ça, ce soit les fioritures associées et non listées !)

Concrètement, c'est vraiment pas intéressant de vérifier les messages Windows reçus par la fenêtre.
C'est sans doute plus simple d'écrire une fausse boucle de message (mode barbare: on !) et de vérifier ce qui passe dedans. (OutputDebugString)
Étape 1: GetMessage
Étape 2: DispatchMessage (Facultatif ici)
Étape 3 => Étape 1

Folco > Es-tu certain que le winId() retourne un HANDLE valide à l'intérieur du constructeur de ton objet ? Sous certains Framework (ex: .NET), c'est à peu près garanti que non.
Les types sont pas particulièrement étanges en réalité:
BYTE => Un octet
WORD => Mot (de 16 bits)
DWORD => Le double du précédent (donc 32 bits)
QWORD => Le double du précédent (donc 64 bits)
Les autres sont un peu plus mystiques, surtout pour les non initiés, mais c'est plutôt bien documenté: https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx (Au passage, je découvre le DWORD32 et le DWORD64 sick)

Concernant le champ message de MSG, effectivement, ça stocke un entier 32 bits là où le message est codé sur 16 bits seulement (Voir WM_USER au passage pour la culture).
Sauf contre-indication (expérimentale), tu n'as pas à te préoccuper de ce détail: C'est soit pour le jour où le système utilisera des Id de message 32 bits, soit pour se réserver la possibilité de "masquer" des messages smile

Maintenant…

Comme le dit Zerosquare, il faut vérifier que la fonction RegisterHotKey a bien fonctionné. Si ce n'est pas le cas, GetLastError te donnera le code d'erreur (que tu pourras convertir en texte avec FormatMessage)
Si cela fonctionne bien, il faut vérifier que le message soit bien transmis (tu peux donc coder à l'arrache une boucle de message dans une méthode de ta classe, et mettre un point d'arrêt voir ce qui s'y passe)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

132

GoldenCrystal (./131) :
(Étape 1: Écrire dans une DLL un WindowProc pour sous-classer une fenêtre, Étape 2: Écrire du code pour injecter la dite DLL dans un process cible, Étape 3: Profit)
(oui, c'est ce que je pense aussi et ça marche bien avec les anciennes versions de Windows, mais j'imagine que c'est aussi ce que font les softs que j'ai trouvés. Or vu qu'ils ne semblent plus marcher, il doit y avoir une subtilité...)
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

133

(Faut certainement que tu marques ton programme comme requérant le mode administrateur et que tu t'octroies de ton propre chef les droits d'aller modifier les autres processus même lorsqu'ils sont protégés… Je pense. Et je regarderai à l'occasion.)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

134

Vous êtes des amours. Je vais essayer vos pistes, avec des messages plus simples, lire les erreurs, merci beaucoup top

Et oui Zerosquare, là je suis un peu en mode "je suis largué", parce que je connais absolument pas Windows, que Qt c'est parfait en satndalone (très complet, je résouds quasiment tous les problèmes que je rencontre), mais là je suis quand même aux fraises...

Donc c'est reparti avec vos idées, on va y arriver, un grand merci. smile

i1VVK

135

(mouarf, t'as ressorti ce smiley grin)
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

136

(parce que je le pense ! grin)

Bon :
- le register hotkey ne retourne pas d'erreur
- exécuter en tant qu'administrateur ne change rien
- mettre des breakpoints quand on compile en release, ça risque pas de marcher, c'est peut-être pour ça qu'hier je rentrais plus dans mon handler (avant-hier, j'y arrivais) triso

La suite -> tenter autre chose qu'émettre un event, tenter d'utiliser un autre message que WM_HOTKEY. smile

137

Tu peux essayer un test-case minimaliste ?
Étape 1: Un fichier main.cpp tout propre avec un main() dedans.
Étape 2: Enregistrer une HotKey.
Étape 3: GetMessage(…)
Étape 4: Afficher un truc sur la console si le message est WM_HOTKEY.
Étape 5 => Étape 3

Ce genre de truc te permettrait déjà de t'assurer que tout marche sur le principe. C'est sans doute plus compliqué de déboguer avec ton application entière qui utilise Qt. Si tu fais marcher le cas simple, par contre, tu devrais arriver à faire marcher le cas compliqué.
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

138

Je dois bien avoir un problème de winId(), parce qu'avec if (!RegisterHotKey(NULL, 1, MOD_ALT | 0x4000, 0x42)) au lieu de if (!RegisterHotKey((HWND)winId(), 1, MOD_ALT | 0x4000, 0x42)), j'ai des events "windows_dispatcher_MSG" qui arrivent, sinon j'ai rien.

Quand je mets un beep(), je l'entends parfois, sans savoir pourquoi.
Quand je mets WM_SIZE et que je redimensionne, ça ne fait rien.

J'ai ajouté ça :
        MSG* msg = static_cast<MSG*>(message);

        count++;
        qDebug() << QString("Event count: %1. Message: %2").arg(count).arg(msg->message);

        if (msg->message == WM_HOTKEY)
Je reçois donc des milliers d'event, la majorité ce sont des #1025 (décimal), parfois des #275. Je les reçois quand la souris bouge, au survol des widgets, au redimensionnement, quand un timer expire etc...
Mais pas de #786 sad https://msdn.microsoft.com/en-us/library/windows/desktop/ms646279%28v=vs.85%29.aspx

Je continue...


EDIT -> donc quelque chose entièrement en-dehors de Qt ? J'ai juste besoin de windows.h et en avant ?

139

(Oui, windows.h ^^)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

140

Bon, ça, ça marche :
#include <QCoreApplication>
#include "windows.h"
#include <QDebug>

int main(int argc, char *argv[])
{
    if (RegisterHotKey(NULL, 1, MOD_ALT | 0x4000, 0x42))  //0x42 is 'b'
    {
        //_tprintf(_T("Hotkey 'ALT+b' registered, using MOD_NOREPEAT flag\n"));
        qDebug() << "Hotkey 'ALT+b' registered, using MOD_NOREPEAT flag";
    }

    MSG msg = {0};
    while (GetMessage(&msg, NULL, 0, 0) != 0)
    {
        if (msg.message == WM_HOTKEY)
        {
            //_tprintf(_T("WM_HOTKEY received\n"));
            qDebug() << "WM_HOTKEY received";
        }
    }

    return 0;
}
C'est un bête copier/coller du code d'exmple de MS, sauf que j'ai remplacé tprintf (sékoiça ??) avec un qDebug(). Ca marche à au poil.

Etape suivante : on crée une QApplication, on installe le handler kivapabien, et on exécute la qapplication. Le tout dans un fichier, un thread, toussa.
• Folco retourne à son éditeur en croisant les doigts.

141

Dans ton app Qt, tu pourrais essayer d'enregistrer la HotKey uniquement après l'affichage de la fenêtre ? (Apparemment Qt semble avoir un évènement "Show", ça fera l'affaire)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

142

Même pas, j'ai d'abord essayé sans fenêtre, avec le code le plus basique possible :
#include <QAbstractNativeEventFilter>
#include <QCoreApplication>
#include <QDebug>
#include "windows.h"

class NativeEventFilter: public QAbstractNativeEventFilter
{
    public:
        bool nativeEventFilter(const QByteArray& eventType, void* message, long*)
        {
            if (eventType == "windows_dispatcher_MSG")
            {
                MSG* msg = static_cast<MSG*>(message);
                qDebug() << QString("Message: %1").arg(msg->message);

                if (msg->message == WM_HOTKEY)
                {
                    qDebug() << QString("Event WM_HOTKEY received");
                    return true;
                }
            }
            return false;
        }
};

int main(int argc, char *argv[])
{
    if (RegisterHotKey(NULL, 1, MOD_ALT | 0x4000, 0x42))  //0x42 is 'b'
    {
        qDebug() << "Hotkey 'ALT+b' registered, using MOD_NOREPEAT flag";
    }

    QCoreApplication app(argc, argv);
    NativeEventFilter* nef = new NativeEventFilter;
    app.installNativeEventFilter(nef);
    return app.exec();
}
je crois que c'est pas la peine d'essayer avec une fenêtre si j'arrive pas à faire marcher un code aussi basique que ça ?
Je vais continuer à creuser, toujours est-il que votre patience, à tous ceux qui m'aident, est vraiment très appréciée. Je me rends compte que le débogage de haut nievau sur PC, c'est as tout à fait la même chose que sur VTI...
Et là, c'est le drame. Je reçois les events n° 36, 131, 1, 1025, et puis plus rien. Ctrl-b qui marchait si bien tout à l'heure ne fait plus rien.

143

C'est quand même vraiment bizarre tout ça, Qt doit certainement faire quelques bidouilles bien étranges…
Je vais voir si je trouve des infos là dessus.

EDIT: http://doc.qt.io/qt-5/qcoreapplication.html#eventDispatcher
http://doc.qt.io/qt-5/qabstracteventdispatcher.html#installNativeEventFilter
Tu peux essayer en passant par ça ?
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

144

• Folco lis la doc...
Tiens tiens tiens :
QAbstractEventDispatcher also allows the integration of an external event loop with the Qt event loop.
On va tenter, même si les explications sont encore un peu confusantes à mes yeux. Merci, au moins j'ai du pain sur la planche top

Bon, j'imagine que tu voulais quand même que je fasse plus que remplacer app.installNativeEventFilter(nef); par app.eventDispatcher()->installNativeEventFilter(nef); ? grin
En tout cas, ça change rien. Ca commence à me gonfler sévère, c'est grave.

145

Non, j'espérais sérieusement que ça suffise grin
Dans la doc de QAbstractEventDispatcher, j'ai lu que c'est cette classe qui prenait en charge le fait de transférer ou non l'évènement à l'instance de QApplication, j'espérais donc naïvement que tu en voies plus…
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

146

Tu veux parler de filterNativeEvent j'imagine ?
J'étais plutôt en train de regarder [url=http://doc.qt.io/qt-5/qabstracteventdispatcher.html#registerEventNotifier[/url]
Ca veut dire que je dois dériver et instancier un QAbstractEventDispatcher, et qu'en suite je vais appeler son setNativeEventFilter ?

• Folco remet l'ouvrage sur le métier.


En fait, j'arrive pas à avancer parce que j'ai pas une idées claire ni des évènements Windows, ni des évènements Qt. Je déteste programmer comme ça, de manière pifométrique, c'est crade :/

147

(Je proposais pas de dériver d'un QAbstractEventDispatcher, car ça peut être vraiment compliqué, mais dans le pire des cas, ça serait la solution, oui…)

En fait, je parlais de ça:
QAbstractEventDispatcher Class
The QAbstractEventDispatcher class provides an interface to manage Qt's event queue.

An event dispatcher receives events from the window system and other sources. It then sends them to the QCoreApplication or QApplication instance for processing and delivery. QAbstractEventDispatcher provides fine-grained control over event delivery.
Ça sous-entendait que le dispatcher pouvait manger des évènements (j'ai toujours l'impression que c'est le cas, d'ailleurs).
Maintenant, dans la doc de filterNativeEvent, ils disent qu'une implementation doit bien transéferer tous les évènements, alors c'est bizarre.

D'autant plus que pour l'instant je ne vois rien de bizarre dans le code de Qt…

EDIT: Ah !
Tu recevais pas les messages quand tu associais la HotKey à une fenêtre car:
On Windows, eventType is set to "windows_generic_MSG
" for messages sent to toplevel windows, and "windows_dispatcher_MSG" for system-wide messages
Maintenant, pourquoi tu ne vois pas passer les messages de HotKey dans le cas global… Je ne sais pas encore.

EDIT2: On dirait que QT installe un hook global sur GetMessage… Et redirige tous les messages sur un handle de fenêtre interne… C'est pas du tout du tout une boucle d'évènements standard. C'est beaucoup plus compliqué et ça n'apporte pas grand chose :/
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

148

Oh, t'es allé faire un tour dans les sources pour pouvoir dire ça ? J'ai même pas tenté...

149

Je vais toujours voir les sources quand j'ai une question… Quand tu as épuisé la majorité de tes options, et sauf si le code est vraiment dégueu, c'est toujours plus simple que du "black-box-testing" ^^

En l'occurence, j'ai vu ce que je voulais voir, et du coup je ne suis pas plus avancé pour t'aider… :/
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

150

J'ai déjà mis le nez plusieurs fois dans les sources de Qt, mais ne connaissant pas du totu Windows, j'ai même pas essayé. Merci beaucoup pour tout ce que t'as fait. Maintenant, la solution pour moi c'est où un tour de magie, ou l'apprentissage de Windows pour faire ça en natif.
Pour apprendre Qt, c'est facile parce que tu parts de l'interface, et tu codes un clic, un survol, un ajustement etc... tu descends dans la complexité, tu découvres les classes une à une.
Pour Windows, ya pas de concepteur d'interface de ce genre, et j'ai pas envie de lire la doc de 150 classes avant d'écrire ma première ligne, pas le courage :/

En tout cas, un grand merci. Je sais pas pourquoi, mais j'ai l'impression que je suis le seul à me mettre dans ce genre de galère, ou totu au moins le seul à ne pas savoir en sortir...