Buchstaben an anderes Programm übergeben



  • Schönen guten Abend!

    Mein Programm (dialogfeldbasierend) soll in der Lage sein,
    Zeichen (Buchstaben, ...) an andere Programme zu übergeben.
    Das heißt zum Beispiel, im Vordergrund läuft mein Dialogfeld,
    dahinter zB. Microsoft Word. Wenn jetzt ein Button gedrückt wird,
    soll mein Programm ein Zeichen (zB.:'A') an Word senden.
    (So wie wenn die Taste A gedrückt worden wäre).

    Kann mir jemand sagen, ob und wie so etwas möglich ist?

    Bitte um Hilfe!

    mfG
    Firestormer



  • Servus,

    jau ist es. Du kannst es so machen das halt virtuell von deinem Programm aus die Taste "A" an word geschickt wird. Ich erkläre dir kurz die Schritte die du dazu brauchst und dann guckste mal in die MSDN solltest du eigentlich hinbekommen.

    Beispiel:

    1. Nimmst du dir die Func EnumWindowsProc

    BOOL CALLBACK CDeinDlg::EnumWindowsProc(HWND hwnd, LPARAM lParam)
    {
    	TCHAR szBuffer[256];
    	memset(szBuffer,0,sizeof(szBuffer));
    
    	::GetWindowText(hwnd, szBuffer, sizeof(szBuffer));
    	if (szBuffer[0] == 'P' && szBuffer[1] == 'a' 
    		&& szBuffer[2] == 'u' && szBuffer[3] == 'l')
    	{
    		m_hHandleWnd = hwnd;		
    		m_bSearch = TRUE;
    	}
    
    	return TRUE;
    }
    ////////////////////////////////////
    //.h deklarieren
    static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);
    

    Die Func geht jedes TopLevel Fenster einzeln durch und durchsucht in dem Fall den Dialognamen. Heisst der Dlg nun "Paul" dann wird die MemberVar m_bSearch als BOOL auf True gesetzt und die m_hHandleWnd erhält das Handle von dem Fenster, dass du benötigst um später einen Tastendruck an diesen zu senden. Kannst natürlich mit der Methode noch Klassenname etc. herausfinden, das was du gerade benötigst. Schau einfach mal in MSDN unter EnumWindowsProc.

    Den Aufruf kannst du so gestalten:

    ::EnumWindows(EnumWindowsProc, (LPARAM)this);
    

    Wenn du das alles gemacht hast dann kannst die einfach mit PostMessage eine Nachricht dan das Fenster schicken. PostMessage aus dem Grund, es wartet nicht ab bis das Fenster die Message verarbeitet hat, sondern kehrt direkt zurück. Vorteil: Sollte ein anderen Prog einen Hänger haben, an dem du die Nachricht schickst, kann es etwas dauern bis dein Programm reagiert. Also nehmen wir hier einfach mal PostMessage:

    ::PostMessage(m_hHandleWnd, WM_KEYDOWN, VK_A, NULL);
    

    Nun schickst du an das Fenster durch das Handle, m_hHandleWnd eine Nachricht. Das Handle haben wir ja vorher durch EnumWindowsProc herausgefunden. Jetzt guckst du mal in der MSDN unter "WM_KEYDOWN" und siehe da, als erster Parameter kann ein Virtuel Key übergeben werden. d.h. Wir nehmen in deinem Fall "VK_A". Es gibt noch viele mehr findest du aber glaube ich in der "windows.h".

    Jetzt packst du das ganze zusammen in ein Programm und es sollte funzen 😃

    Viel Spass
    *winke*
    Hellsgore



  • Aloha,

    spannendes Tutorial. 👍

    Die Kürzel VK_A, usw. werden bei mir nicht erkannt.

    Was muß ich denn includieren ?

    windows.h funzt net.

    Er sagt trotzdem nicht deklarierter bezeichner.

    Ich hatte das Prob schon einmal, habe die Lösung aber vergessen.

    Grüße

    BOA

    Ich plädiere für die Übernahme in die FAQ, liebe Mods.



  • Servus,

    ähm habe mich vertan das muss "winuser.h" heißen. Mhmm stimmt VK_A gibs nitt. Habe bisher nur VK_F1 - VL_F12 versendet. Aber probiers doch mal so...

    PostMessage(WM_KEYDOWN, (WPARAM)"A", NULL);
    

    Vielleicht geht es *g*... Keine Ahnung musst du mal ausprobieren. 😃

    *winke*
    Hellsgore



  • besser so:

    WPARAM wParam = <dynamic_cast> "A";
    ::PostMessage(WM_KEYDOWN, wParam, 0);
    

    oder?



  • Aloha,

    die Variante habe ich auch schon getestet.

    Ich habe mal ne simple Word-Anwendung gestartet, Focus liegt nach dem Öffnen auf dem leeren Dokument.
    Ich krieg vom PostMessage nen True zutück, wenn ich 'a' sende.

    Er schreibt aber nichts in das Dokument ?

    Grüße

    BOA



  • Servus,

    das war schon richtig wie ich das gesagt habe.

    PostMessage(WM_KEYDOWN, (WPARAM)'A', NULL);
    

    Allerdings ist mir gerade aufgefallen das du dann diesen Buchstaben an das Hauptfenster schickst und das damit nichts anfangen kann. Du müsstest schon dann das Handle von dem Dokument haben. Dieses ChildWindow musst du jetzt irgendwie herausbekommen.

    Frag mich jetzt aber nicht wie musste mal in der MSDN suchen obs da sowas wie EnumChildWindow gibt. Dann musst du wie mit EnumWindowsProc nicht nach dem Namen sondern nach der Klasse _WwG suchen. Das sollte dann das Fenster sein.

    Das wird aber nun schon etwas komplizierter 😃
    Mit Spy++ kannst du wunderbar sehen, ob eine Nachricht an deinem Fenster ankommt und auch wo sie ankommt.

    Aber wie gesagt jetzt musste mal ein bisschen rumprobieren......

    *winke*
    Hellsgore



  • Wiederum schönen guten Abend!

    Danke vorerst einmal!

    Ich habe folgendes wie vorgeschlagen ausprobiert:

    BOOL CALLBACK CDeinDlg::EnumWindowsProc(HWND hwnd, LPARAM lParam) 
    { 
        TCHAR szBuffer[256]; 
        memset(szBuffer,0,sizeof(szBuffer)); 
    
        ::GetWindowText(hwnd, szBuffer, sizeof(szBuffer)); 
        if (szBuffer[0] == 'P' && szBuffer[1] == 'a' 
            && szBuffer[2] == 'u' && szBuffer[3] == 'l') 
        { 
            m_hHandleWnd = hwnd;        
            m_bSearch = TRUE; 
        } 
    
        return TRUE; 
    } 
    //////////////////////////////////// 
    //.h deklarieren 
    static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);
    

    Folgendes Problem gab es dabei:

    EnumWindowsProc ist ja STATIC definiert, die Variable m_hHandleWnd kann auch nur static sein, wenn sie verwendet werden soll, das bekomm ich aber irgendwie nicht hin!

    Kann mir jemand sagen wie ich das machen muss?

    Danke im voraus!

    mfG
    Firestormer


Anmelden zum Antworten