Umwandlung bei keybd_event Verhindern.

theliquidone

Grünschnabel
Hi :)

Ich habe mir ein kleines C++ Programm geschrieben, dass ich zum Coden für PHP benutzen will.

Immer wenn ich das Programm öffne soll er einen string in Notepad++ einfügen.
In dem string müssen Groß und Kleinschreibung sowie Sonderzeichen und Zahlen beachtet werden.

Hier ist mal mein Code:
PHP:
#include <iostream>
#include <windows.h>
#include <string>

using namespace std;

int main()
{
      bool Weitermachen = true;
      HWND NppFenster;

      while (1)
      {
            if ((NppFenster = FindWindow(0, "Notepad++")) && (Weitermachen == true))
            {
                  SetForegroundWindow(NppFenster);

                  Sleep(1000);

                  string MyCode = "$Beispiel = strlen($Test) + 25;";
                  int i;

                  // Fehler bei strlen()
                  for (i = 0; i < strlen(MyCode); i++)
                  {
                        keybd_event((char)MyCode[i], 0, 0, (DWORD)NULL);
                        keybd_event((char)MyCode[i], 0, KEYEVENTF_KEYUP, (DWORD)NULL);
                  }

                  Weitermachen = false;
            }
      }

      return 0;
}

Also, wie im Code kommentiert kommt bei strlen(MyCode) ein Fehler.
Das 2te Problem ist, dass er die Keys zwar sendet, aber Groß und Kleinschreibung nicht beachtet und Zahlen zu ASCII-Keys konvertiert werden...

Wie kann ich dem entgegenwirken?
Ich lerne seit 2 Wochen intensiv C++, aber wie ich dieses Problem löse, ist mir fraglich.

~ Chris
 
1.Problem:
"MyCode" ist ein Objekt der string-Klasse. Da kannst du kein "strlen()" verwenden. Die Klasse selbst hat eine Methode, um die Länge zu ermitteln (siehe Beispiel).

2. Problem:
Ich denke, du musst die Zeichen als UNICODE-Zeichen senden. Außerdem ist "keyb_event()" obsolet. Verwende stattdessen besser die Funktion "SendInput()".

Hier das Beispiel:
C++:
std::wstring MyCode = L"$Beispiel = strlen($Test) + 25;"; 

for( size_t i = 0; i < MyCode.size(); i++ )
{
    INPUT sInput;
    sInput.type           = INPUT_KEYBOARD;
    sInput.ki.wVk         = 0;
    sInput.ki.dwFlags     = KEYEVENTF_UNICODE;
    sInput.ki.wScan       = (wchar_t)MyCode[i];
    sInput.ki.time        = 0;
    sInput.ki.dwExtraInfo = 0;
    
    SendInput(1, &sInput, sizeof(sInput));
}
Gruß
MCoder
 
Hmm, das ist seltsam, denn das ist Bestandteil der Windows-API. Meckert der Compiler nur bei der Struktur "INPUT" oder auch bei der Funktion "SendInput()"? Womit entwickelst du denn?

Gruß
MCoder
 
Hi.
Die windows.h habe ich ge-includet.
Ich benutze die neue Code::Blocks 8.02 als IDE und Compile mit GNU CPP.
Hier sind die Fehler:
Code:
In function `int main()':
error: `INPUT' was not declared in this scope
error: expected `;' before "sInput"
error: `sInput' was not declared in this scope
error: `INPUT_KEYBOARD' was not declared in this scope
error: `KEYEVENTF_UNICODE' was not declared in this scope
error: `SendInput' was not declared in this scope
warning: unused variable 'INPUT'
warning: unused variable 'INPUT_KEYBOARD'
warning: unused variable 'KEYEVENTF_UNICODE'
warning: unused variable 'SendInput'

Danke,
Chris
 
Ich hatte auch das gleiche Problem.
Bei mir hat geholfen wenn ich vor den
#includes dies definiert hat (habs irgendwo
hier im forum gelesen das man das machen soll)

Code:
#define _WIN32_WINNT 0x0500

ich hoffe es hilft dir :D
 
Sehr kurios, aber es geht ^^

Nur ein Problem.
Wenn ich mehrere Buchstaben hintereinander in meinem String habe, z.B. AAAAD kommt daraus nur AD - woran kann dies liegen?

EDIT: Da ich dieses Console Fenster ja nicht immer sehen will - wie blende ich das komplett aus? Also dass es nurnoch im TaskManager zu sehen ist?

~ Chris
 
Zuletzt bearbeitet:
Wenn ich mehrere Buchstaben hintereinander in meinem String habe, z.B. AAAAD kommt daraus nur AD - woran kann dies liegen?
Hab's gerade mal kurz getestet (Mit Visual Studio und dem normalen Notepad) und da tritt das Problem nicht auf :confused:

Da ich dieses Console Fenster ja nicht immer sehen will - wie blende ich das komplett aus? Also dass es nurnoch im TaskManager zu sehen ist?
Du könntest eine Windows-App draus machen. Allerdings habe ich keine Ahnung, wie die entsprechenden Projekteinstellungen bei Code::Blocks funktionieren.

Gruß
MCoder
 
Nur ein Problem.
Wenn ich mehrere Buchstaben hintereinander in meinem String habe, z.B. AAAAD kommt daraus nur AD - woran kann dies liegen?

Du könntest evtl. gleich per WM_CHAR oder WM_KEYDOWN die entsprechenden Buchstaben an das (richtige!) Fenster posten..


EDIT: Da ich dieses Console Fenster ja nicht immer sehen will - wie blende ich das komplett aus? Also dass es nurnoch im TaskManager zu sehen ist?

Wenn du die Konsole anfangs noch brauchst, dann gib sie später mit FreeConsole frei.
Ansonsten halt gleich als Windows-Projekt compiliern...
 
Zurück