fenster in Vordergrund stellen



  • kann mir bitte mal einer helfen. Ich tu schon ewig da rum...
    bekomm noch nen anfall 😉
    folgendes prob.
    ich möchte mit c/c++ (egal, was geht halt) ein Fenster in den vordergrund stellen oder sichtbar machen(falls in der Taskleiste).
    ich lese die Process id mittels java aus, rufe dann ne C/C++ Methode auf und übergebe diese ID..
    das geht bis dahin perfekt 😉
    in VB geht das locker, aber ich brauch das unbedingt in C/C++

    Ich find da zwar sehr viel im netz dazu, aber nichts was mir wirklich zum ziel verhilft..
    geht das denn nicht irgendwie mit getProcessById().. find die methode zwar aber kann nichts damit anfangen..
    in vb hab ichs so gemacht.. und dann mit
    SetForegroundWindow() und
    ShowWindow() die Fenster angesprochen...
    muss doch mit C/C++ auch gehen.. also auf die win32 API zugreifen..
    ein beispielcode wäre super, denn c/c++ ist nicht gerade meine programmiersprache^^ ausserdem bin ich noch nicht sooo lange progger(newbie ;)!!!

    schon mal thx an alle die helfen wollen



  • FindWindow() //oder so =>MSDN
    SetForegroundWindow(hwnd) //oder so =>MSDN

    google spuckt beispiele ohne ende...



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Mittlerweile ist das nicht mehr so einfach möglich (was auch gut so ist, da man den User damit ziemlich nerven kann). SetForegroundWindow sollte zwar noch funktionieren, wird aber auf neueren System (ist mir so zu Ohren gekommen) nicht mehr oder nur noch eingeschränkt funktionieren. Alternativ geht auch SetActiveWindow.



  • die ganzen beispiele gehen ja bei mir nicht.. deswegen schreib ich doch hier rein!!
    mit findWindow hole ich mir das window handle und dann kann ich damit arbeiten.. na das steht überall, aber das funzt nicht.
    hat denn nicht einer nen kleinen beispielcode in dem man die process id einträgt und so das fenster in den vordergrund kommt.. oder beendet oder sonst was..
    ich hab jetzt bestimmt schon 150 beispiele durchprobiert und weiss echt nicht wo das prob ist..
    in vb und c# funktionierts doch auch..
    warum nicht in c++???????????????


  • Mod

    @MScalli

    Es geht! Denn das OS wurde nichtin VB entwickelt sondern in VC 🙂
    Was also in VB geht geht erst recht in VC!

    Jetzt würde mich mal interessieren, was nicht geht.
    Schreib doch einfach mal was Du schon geschrieben hast und was nicht geht...

    Wenn ich ein Handle habe dan benutzer ich es einfach und führe SetForegroundWindow aus. Das it ein Zweizeiler (Dreizeiler, wenn man auf Fehler prüft:

    HWND hWnd = FindWindow("MyTestClass", "My Super test Window");
    if (hWnd)
        SetForegroundWndow(hWnd);
    


  • das wird das prob sein.. denn ich habe kein handle..
    ich komme an die process id und/oder den namen des fensters ran(ist ein fremdes fenster und ich lese die daten aus dem taskmanager aus)aber wie bekomme ich mittels der pid ode dem namen an das handle??.
    sry aber den quellcode willst du gar net sehen(100 mal verändert, gelöscht usw.)
    in vb konnte ich mittels Process das handle holen.. aber das kennt c++ gar net bei mir!!!


  • Mod

    In VB! Du meinst VB.NET wenn Du von Process sprichst.

    Wenn Du den Namen/Titel des Fensters hast. dann nimm doch FindWindow!

    Ich habe das Gefühl, dass Du nicht mal die Code Schnippsel in der Doku nachliest, die man Dir gibt... 👎



  • habs ja damit probiert..
    also ich häng mich da jetzt noch mal rein und meld mich später noch mal.
    und glaub mir bitte.. ich hab mir schon so viel zu dem thema durchgelesen, aber das klappt nicht. mach schon seit tagen rum!!!
    schau das ich es bis heut abend evtl. zu nem einigermassen verständlichen quellcode zusammen schreibe und poste das im ganzen!!
    danke für eure hilfe!!
    ich hoffe ihr schaut es euch dann noch mal an
    😕



  • Lese bitte genau in der MSDN-Doku zu SetForegroundWindow() http://msdn2.microsoft.com/en-us/library/ms633539.aspx, u.a. steht dort:
    The process is the foreground process.

    Und den folgenden Abschnitt aus "INFO: SetActiveWindow() and SetForegroundWindow() Clarification" http://support.microsoft.com/kb/97925/en-us:
    "Applications can call AttachThreadInput() to allow a set of threads to share the same input state. By sharing input state, the threads share their concept of the active window. By doing this, one thread can always activate another thread's window. This function is also useful for sharing focus state, mouse capture state, keyboard state, and window Z-order state among windows created by different threads whose input state is shared."

    Kurz und bündig: Mit AttachThreadInput() kannst Du Dich quasi in den anderen Prozeß (nämlich den foreground process mit dem aktiven Fokus) einklinken, und Dir damit die nötige Berechtigung verschaffen, das Fenster von Deiner eigenen Applikation in den Vordergrund zu bringen. 💡

    Gruß
    Martin



  • vielen vielen dank an alle für die hilfe.
    also habe es jetzt soweit hinbekommen..
    komplett sieht es so aus!!

    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    int main()
    {
    	// Name des Fensters(soll von mylibparams übergeben werden)
    	char wnd_name[] = "test";
    	int iCmdShow = 1;
    
    	HWND hWnd = FindWindow(NULL , wnd_name);
    
    	// nur zur Fehlerbehandlung
    	if(hWnd){
    		printf("hWnd is true");
    	}
    	else{
    		printf("hWnd is false");
    	}
    
    	SetForegroundWindow(hWnd);
    	ShowWindow(hWnd,iCmdShow);
    }
    

    jetzt weiss ich auch warum ihr gemeint habt das ich da nicht geschaut habe..
    wenn man es mal hat sieht es einfach aus^^ das eigentliche Problem war das verwirrende mit dem aufruf
    der cpp Methode.. und das NULL nach FindWindow 😉

    habe jetzt halt noch folgendes Problem. wie gesagt will ich das mittels java aufrufen..
    bis jetzt mache ich das so..

    ..zuerst rufe ich die klasse in java auf und übergebe den Prozess Namen

    // Aufruf der Klasse die für den Aufruf der C++ Methode verantwortlich ist
    NativeCallerParams caller = new NativeCallerParams(gewaehlterprocessname);
    caller.printline(gewaehlterprocessname);
    

    ..die Klasse die über eine c++ Methode verfügt

    public class NativeCallerParams 
    {
    	static String pid;
    	NativeCallerParams(String pn)
    	{
    		pname = pn;
    	}
    	static 
    	{
    		System.loadLibrary("mylibparams");
    	}
    	public native void printline(String msg);
    }
    

    .. und hier die Methode, die bis jetzt nur den übergebenen Prozess Namen anzeigt

    #include <jni.h>
    #include "NativeCallerParams.h"
    #include <stdio.h>
    #include <stdlib.h>
    
    JNIEXPORT void JNICALL Java_NativeCallerParams_printline(JNIEnv *env, jobject obj, jstring jstr) {
    
    	const char *str = env -> GetStringUTFChars(jstr, NULL);
    		printf(str);
    		printf("\n");
    		printf("test\n");
    }
    

    ...str ist hier der Prozess Name

    Ich würde hier gerne das holen des Fensters einbinden.. nur kann ich nicht mal was includen ohne das ich ne masse an Fehlermeldungen bekomme. Wie kann ich aus dieser Methode raus das Prog aufrufen das mein fenster in den
    vordergrund stellt??
    ne Klasse draus machen und dann aufrufen evtl. ?!?!?!
    bitte gebt mir mal nen schubs 😉
    wie gesagt.. bin noch ziemlich neu in C...
    obwohl ich sagen muss das man echt wenig quellcode braucht um ans ziel zu kommen!!
    (aber dauern tuts schon lang^^)


Anmelden zum Antworten