Advertentie:

Auteur Topic: GUI Functie uitbreiden  (gelezen 295 keer)

Offline TopTools

  • Nieuw lid
  • **
  • Berichten: 11
Re: GUI Functie uitbreiden
« Reactie #15 Gepost op: januari 23, 2012, 00:56:05 am »
Citaat
Deze methode werkt vlekkenloos, totdat ik hem in mijn GUI wilde implementeren.

Tja, in dat geval is er iets anders aan de hand, er is geen enkele reden waarom het in een GUI-app opeens niet zou werken.

Dat betekent ook dat er helemaal niets mis is met die lParam want die werkt zonder GUI kennelijk wel.

Offline GroundZero

  • Zeer actief lid
  • *****
  • Berichten: 280
    • Devbizz - webdevelopment
Re: GUI Functie uitbreiden
« Reactie #16 Gepost op: januari 23, 2012, 13:32:28 pm »
Klopt, maar wat ik dacht is het volgende:

Code: C++ (QT)
  1. struct lparam{
  2. }
  3.  
  4. class mijnClasseBlaat {
  5.  
  6. lparam variabele = {};
  7.  
  8. }

Ik vermoed dat in mijn classe, hij de variabele die hij van de struct lparam wilt aanmaken niet goed aanmaakt of zo.
Daarom verstuurd hij de lparam niet goed meer in de functie en werkt het geheel dus niet. Echter heeft niemand mij tot op heden
nog kunnen vertellen waar de fout zit (heb mijn bronbestanden ook online staan).

Offline jeetee

  • Zeer actief lid
  • *****
  • Berichten: 255
Re: GUI Functie uitbreiden
« Reactie #17 Gepost op: januari 23, 2012, 14:03:36 pm »
De FindWindowEx functie stond niet in de code van je GUI-project die je hier hebt gepost, maar lijkt me wel vrij essentieel..
2 + 2 = 5, within a large range of 2

Offline GroundZero

  • Zeer actief lid
  • *****
  • Berichten: 280
    • Devbizz - webdevelopment
Re: GUI Functie uitbreiden
« Reactie #18 Gepost op: januari 23, 2012, 15:24:41 pm »
uhmmm...
Die is niet nodig voor het programma waar naar ik mijn keys wil versturen. De code

void initiateProcess::pressKey(short code){
    HWND hNotepad = FindWindow(0, L"Naamloos - Kladblok");
    if(!hNotepad){
QMessageBox iWindow;
iWindow.setWindowTitle("Window not found");
iWindow.setText("The window was not found");
iWindow.exec();
    }

    SetForegroundWindow(hNotepad);

    short vkCode = LOBYTE(VkKeyScan(code));

    extraKeyInfo lParam = {};
    lParam.scanCode = MapVirtualKey(vkCode, 29);

    PostMessage(hNotepad, WM_KEYDOWN, vkCode, lParam);

    lParam.repeatCount = 1;
    lParam.prevKeyState = true;
    lParam.transitionState = true;

    PostMessage(hNotepad, WM_KEYUP, vkCode, lParam);
    Sleep(100);
}
is het enigste wat nodig is.

Want ik heb het getest met dit:

Code: C++ (QT)
  1. struct extraKeyInfo
  2. {
  3.     unsigned short repeatCount;
  4.     unsigned char scanCode;
  5.     bool extendedKey, prevKeyState, transitionState;
  6.  
  7.     operator unsigned int()
  8.     {
  9.         return repeatCount | (scanCode << 16) | (extendedKey << 24) |
  10.                (prevKeyState << 30) | (transitionState << 31);
  11.     }
  12. };
  13.  
  14. void pressKey( short code )
  15. {
  16.     HWND hNotepad = FindWindow(0, L"FINAL FANTASY XIV");
  17.     if(!hNotepad){ std::cout << "Window not found"; }
  18.  
  19.     SetForegroundWindow(hNotepad);
  20.  
  21.     short vkCode = LOBYTE(VkKeyScan(code));
  22.  
  23.     extraKeyInfo lParam = {};
  24.     lParam.scanCode = MapVirtualKey(vkCode, 29);
  25.  
  26.     PostMessage(hNotepad, WM_KEYDOWN, vkCode, lParam);
  27.  
  28.     lParam.repeatCount = 1;
  29.     lParam.prevKeyState = true;
  30.     lParam.transitionState = true;
  31.  
  32.     PostMessage(hNotepad, WM_KEYUP, vkCode, lParam);
  33.     Sleep(100);
  34. }
  35.  
  36. int main()
  37. {
  38.     pressKey( VK_SPACE );
  39.     pressKey( 'h' );
  40.     pressKey( 'e' );
  41.     pressKey( 'l' );
  42.     pressKey( 'l' );
  43.     pressKey( 'o' );
  44.     pressKey( VK_RETURN );
  45.  
  46.     return 0;
  47. }

en dat werkt perfect, alleen wanneer ik het dan in mijn GUI wil hebben werkt het niet meer ;)

Weet je wat, ik zal eens van nul af aan opnieuw beginnen vanavond / morgen. Misschien dat er dan
meer duidelijkheid komt. Ik zal dan ook even hier weer opnieuw reageren met betere / meer informatie.
« Laatst bewerkt op: januari 23, 2012, 15:28:08 pm door GroundZero »

Offline TopTools

  • Nieuw lid
  • **
  • Berichten: 11
Re: GUI Functie uitbreiden
« Reactie #19 Gepost op: januari 23, 2012, 16:07:44 pm »
Je maakt het veel ingewikkelder dan nodig is.

De lParam variabele voor WM_KEYDOWN wordt gebruikt om extra informatie over het keyboard-event mee te geven.

Het is geen struct maar een bitfield van 32 bits.

Als er geen extra informatie is kun je gewoon NULL meegeven:

PostMessage(hNotepad, WM_KEYDOWN, vkCode, NULL);

Als je een repeat-count wilt meegeven moet je die in bit 0-15 aangeven, een repeat=count van 1 wordt dan:

PostMessage(hNotepad, WM_KEYDOWN, vkCode, 1L);


Offline jeetee

  • Zeer actief lid
  • *****
  • Berichten: 255
Re: GUI Functie uitbreiden
« Reactie #20 Gepost op: januari 23, 2012, 16:19:32 pm »
Het is geen struct maar een bitfield van 32 bits.
Zijn struct is een bitfield van 32-bits (nuja, niet is, maar wel resulteert in).
2 + 2 = 5, within a large range of 2

Offline TopTools

  • Nieuw lid
  • **
  • Berichten: 11
Re: GUI Functie uitbreiden
« Reactie #21 Gepost op: januari 23, 2012, 16:50:32 pm »
Citaat
Zijn struct is een bitfield van 32-bits (nuja, niet is, maar wel resulteert in).

Dat is waar, maar bij het trouble-shooten is het vaak handig om eerst de eenvoudige benadering te testen, als die werkt kun je altijd nog die mooie class-wrapper om je bit-field zetten.

Offline GroundZero

  • Zeer actief lid
  • *****
  • Berichten: 280
    • Devbizz - webdevelopment
Re: GUI Functie uitbreiden
« Reactie #22 Gepost op: januari 23, 2012, 17:37:33 pm »
Kijk, dat gaat dus mijn petje te boven lol. Ik zal er eens mee gaan spelen, dank jullie wel voor je antwoorden <3

Advertentie: