_Van
Mitglied
Hallo und guten Abend euch allen,
ich bin neu hier aber trieb hier Account-los eine Weile herum und muss sagen
das man hier echt viel lernen kann. Leider hab ich für mein derzeitige Probleme
keine Lösung finden können (weder hier noch bei MSDN oder Google und IRC
Chat ist z.Z. unerreichbar).
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Wie ihr schon am Titel seht ist mein erstes Problem die HWND von meinem
eigenen Programm (Dosfenster) zu finden. Folgende Möglichkeiten hab ich ausprobiert:
http://www.tutorials.de/forum/c-c/207091-eigenes-konsolenfenster-verstecken.html
es steht dann immer "fehlgeschlagen!"...
und diese Codeschnipseln (Google) die leider auch nicht funktioniert haben...
per Mausposition HWND zu bestimmten ist nicht gerade die beste Lösung...
http://www.tutorials.de/forum/c-c/206521-mausposition-ereignisse-erzeugen.html
ich dachte mir man könnte was mit GetCurrentThreadId(); machen aber
bin auch auf keine Lösungen gekommen...
naja, ich wollte euch fragen wie ihr eure HWND findet (wenn ihr das überhaupt tut...)
Wofür ich das brauche?:
Wollte xSound lib ausprobieren (finde leider die IternetAdresse nicht) und zum
Initialisierung der ganzen Sache muss ich folgenden Befehl benutzen
InitDirectSound(hWnd,NULL,NULL,2,44100,16)
Darum steig ich auf http://www.fmod.org/ LIB um.
Aber mich würde trotzdem noch interresieren wie man das Problem lösen würde![Smile :) :)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f642.png)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Das zweite Problem ist dieser Code hier den ich mit viel Mühe (bin noch ein C Anfänger)
zusammengestellt hab:
Ich weiß das dieser Code völlig unsauber geschrieben ist aber meine Angewohnheit
leider ist "Erst wenn es funktioniert in Teillösungen verteilen" (zumindenst bei
kleinen Programmen...)
Das Ziel ist einfach eine bestimmte Tastatureingabe (definiert in VK_MY_OP[])
zu simulieren. Wie im Beispielcode zu sehen ist wird die "cmd.exe" attacht und
Input an das Programm übergeben. Das klappt problemlos. Jedoch wenn ich
nun z.B. auf den normalen Editor wechsle (HWND hWnd = FindWindow( NULL, "Unbenannt - Editor" );)
dann passiert nichts. Und bei manchen anderen Programmen funktionierts nur
wenn ich vor jedem einzelnen simulierten Input das Programm manuell entfokusiere
(irgendein anderes Fenster anklicke) und dann wieder fokusiere.
SendInput() und keybd_event() (http://www.tutorials.de/forum/c-c/218748-sendinput.html)
sind auch eine Lösung aber ich will stur bleiben und auf diese Weise das machen
wenn ihr nichts dageben habt![Wink ;) ;)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f609.png)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ich bin euch sehr dankbar für die Zeit die ihr euch nehmt um mir zu helfen![Smile :) :)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f642.png)
Edit:
Sorry, ich vergass zu sagen:
Mein Compiler ist MinGW + MSYS. Cygwin funktioniert leider bei mir nicht ( er findet gcc befehl nicht ),
ich bin neu hier aber trieb hier Account-los eine Weile herum und muss sagen
das man hier echt viel lernen kann. Leider hab ich für mein derzeitige Probleme
keine Lösung finden können (weder hier noch bei MSDN oder Google und IRC
Chat ist z.Z. unerreichbar).
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Wie ihr schon am Titel seht ist mein erstes Problem die HWND von meinem
eigenen Programm (Dosfenster) zu finden. Folgende Möglichkeiten hab ich ausprobiert:
http://www.tutorials.de/forum/c-c/207091-eigenes-konsolenfenster-verstecken.html
Code:
SetConsoleTitle("XYZ");
HWND my_hWnd = FindWindow( NULL, "XYZ" );
if( hWnd != NULL ) printf( "gefunden!\n" ); else printf( "fehlgeschlagen!\n" );
es steht dann immer "fehlgeschlagen!"...
und diese Codeschnipseln (Google) die leider auch nicht funktioniert haben...
Code:
HWND my_hWnd = (HWND)(int)(this.Handle); //bestimmt VB?
HWND my_hWnd = my.HWND; //das auch?
per Mausposition HWND zu bestimmten ist nicht gerade die beste Lösung...
http://www.tutorials.de/forum/c-c/206521-mausposition-ereignisse-erzeugen.html
ich dachte mir man könnte was mit GetCurrentThreadId(); machen aber
bin auch auf keine Lösungen gekommen...
naja, ich wollte euch fragen wie ihr eure HWND findet (wenn ihr das überhaupt tut...)
Wofür ich das brauche?:
Wollte xSound lib ausprobieren (finde leider die IternetAdresse nicht) und zum
Initialisierung der ganzen Sache muss ich folgenden Befehl benutzen
InitDirectSound(hWnd,NULL,NULL,2,44100,16)
Darum steig ich auf http://www.fmod.org/ LIB um.
Aber mich würde trotzdem noch interresieren wie man das Problem lösen würde
![Smile :) :)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f642.png)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Das zweite Problem ist dieser Code hier den ich mit viel Mühe (bin noch ein C Anfänger)
zusammengestellt hab:
Code:
#include <windows.h>
#include <stdio.h>
#define _ATTACH_
WPARAM VK_MY_OP[] = { 'I', 'T', VK_SPACE, 'W', 'O', 'R', 'K', 'S', VK_SPACE, 'O', 'M', 'F', 'G', VK_RETURN };
int main() {
HWND hWnd = FindWindow( NULL, "cmd.exe" );
if( hWnd != NULL )
{
DWORD myThread;
static DWORD newThread;
static DWORD curThread;
myThread = GetCurrentThreadId();
curThread = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
newThread = GetWindowThreadProcessId(hWnd, NULL);
printf("mT = %i; cT = %i; nT = %i\n\n", myThread, curThread, newThread );
printf("SetFocusSucces = %i;\n", SetFocus( hWnd ) );
printf("SetActiveSucces = %i;\n", SetActiveWindow( hWnd ) );
printf("SetEnableSucces = %i;\n\n", EnableWindow( hWnd, TRUE ) );
UINT scan;
LPARAM lparam;
#ifdef _ATTACH_
printf( "a1 = %i\n", AttachThreadInput(myThread, curThread, TRUE) );
printf( "a2 = %i\n", AttachThreadInput(curThread, newThread, TRUE) );
printf( "a3 = %i\n", AttachThreadInput(myThread, newThread, TRUE) );
#endif
int i;
for( i = 0; VK_MY_OP[i]; i++ )
{
scan = MapVirtualKey( VK_MY_OP[i], 0 );
lparam = 0x00000001 | (LPARAM)( scan << 16 );
printf( "PostMessage(KeyDown) = %i;\n", PostMessage(hWnd, WM_KEYDOWN, VK_MY_OP[i], lparam) ); // Key down
Sleep(10);
scan = MapVirtualKey( VK_MY_OP[i], 0 );
lparam = 0xC0000001 | (LPARAM)( scan << 16);
//lparam = lparam | 0x01000000;
printf( "PostMessage(KeyUp) = %i;\n", PostMessage(hWnd, WM_KEYUP, VK_MY_OP[i], lparam) ); // Key up
printf("space was pressed!\n");
Sleep(500);
}
#ifdef _ATTACH_
AttachThreadInput(myThread, curThread, FALSE);
AttachThreadInput(curThread, newThread, FALSE);
AttachThreadInput(myThread, newThread, FALSE);
printf("Deattached Thread Input!\n");
#endif
}
else
{
printf("failed to FindWindow()\n");
getc(stdin);
}
return 0;
}
Ich weiß das dieser Code völlig unsauber geschrieben ist aber meine Angewohnheit
leider ist "Erst wenn es funktioniert in Teillösungen verteilen" (zumindenst bei
kleinen Programmen...)
Das Ziel ist einfach eine bestimmte Tastatureingabe (definiert in VK_MY_OP[])
zu simulieren. Wie im Beispielcode zu sehen ist wird die "cmd.exe" attacht und
Input an das Programm übergeben. Das klappt problemlos. Jedoch wenn ich
nun z.B. auf den normalen Editor wechsle (HWND hWnd = FindWindow( NULL, "Unbenannt - Editor" );)
dann passiert nichts. Und bei manchen anderen Programmen funktionierts nur
wenn ich vor jedem einzelnen simulierten Input das Programm manuell entfokusiere
(irgendein anderes Fenster anklicke) und dann wieder fokusiere.
SendInput() und keybd_event() (http://www.tutorials.de/forum/c-c/218748-sendinput.html)
sind auch eine Lösung aber ich will stur bleiben und auf diese Weise das machen
wenn ihr nichts dageben habt
![Wink ;) ;)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f609.png)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ich bin euch sehr dankbar für die Zeit die ihr euch nehmt um mir zu helfen
![Smile :) :)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f642.png)
Edit:
Sorry, ich vergass zu sagen:
Mein Compiler ist MinGW + MSYS. Cygwin funktioniert leider bei mir nicht ( er findet gcc befehl nicht ),
Zuletzt bearbeitet: