Wie erstelle ich aus einer DLL ein (am besten transparentes,durchklickbares) Fenster?



  • Wenn du noch nie ein Fenster mit C und WinAPI erstellt hast acker erstmal nen tutorial durch, denn solche speziellen sachen wird dir wohl keiner vorprogrammieren. (Ich lasse mich gern eines besseren belehren 😃 )



  • ich hab nen Tutorial durchgemacht^^

    da geht das über WinMain Funktion die allerlei übergeben bekommt, und dadrauf wird dann ein Fenster gezeichnet. Ich weiß halt nicht wie ich das in eine DLL packe...
    diesem "CreateWindowEx" muss man ja einiges übergeben was in der Parameterliste von winmain steht ..



  • Lumpeh schrieb:

    diesem "CreateWindowEx" muss man ja einiges übergeben was in der Parameterliste von winmain steht ..

    nö eigentlich nicht - eigentlich nur den Parameter hInstance für deine WndClass Struktur, aber den kriegst du ja wie oben erwähnt auch durch GetModuleHandle(0) (glaube wird auch in der Dll Main übergeben).



  • GetModuleHandle, darf man in diesem Fall doch glaube ich nicht in der DLL aufrufen - ich glaube da mal gelesen zu haben das das Probleme macht.
    Oder verwechsel ich da etwas?



  • Moinsen Leutz!

    Tschuldigung, dass ich mich in diese Diskussion einklinke, aber aus ner dll ein Fenster aufpoppen lassen, ist verdammt unsauber. Eine Bibliothek, welche dynamisch geladen wird, sollte nur Funktionalitäten, aber keine UserIntrfaces als solche aufweisen. Die Applikation die drüber hängt muss immer die volle Kontrolle haben, sonst verstrickt man sich in monatelangen Debugsitzungen.
    Kleiner Tipp: Applikation bauen, in der alle Interaktionen zwischen Mensch und Maschine abgehandelt werden. Ist auch wesentlich einfacher zu programmieren.

    Bis denne. und viel Erfolg. stefan



  • Es soll sich auch nicht um ein Userinterface handeln..



  • Hubdehoe schrieb:

    Tschuldigung, dass ich mich in diese Diskussion einklinke, aber aus ner dll ein Fenster aufpoppen lassen, ist verdammt unsauber.

    Wer hat Dir das erzählt?

    Hubdehoe schrieb:

    Eine Bibliothek, welche dynamisch geladen wird, sollte nur Funktionalitäten, aber keine UserIntrfaces als solche aufweisen.

    Warum interessiert es, ob die Bibliothek statisch oder dynamisch ist? Vollkomenn egal.
    Ausserdem...MessageBoxen benutzt Du sicher auch (oder File-, oder Druckertreiberdialoge, oder...)?! Ist das kein GUI aus einer DLL?

    Hubdehoe schrieb:

    Die Applikation die drüber hängt muss immer die volle Kontrolle haben, sonst verstrickt man sich in monatelangen Debugsitzungen.

    Naja, bloß weil man eine Technologie nicht beherrscht, ist sie nicht böse...
    Und eine DLL zu debuggen ist auch komfortabel möglich.

    Hubdehoe schrieb:

    Kleiner Tipp: Applikation bauen, in der alle Interaktionen zwischen Mensch und Maschine abgehandelt werden. Ist auch wesentlich einfacher zu programmieren.

    Kleiner Tipp: Den kleinen Tipp von oben vergessen, wenn es einen Grund gibt, die Funktionalität zu auszulagern (z.B. wenn mehrere Programme dieselbe Funktionalität nutzen). Eine andere Frage ist dann, ob statische Lib oder DLL.



  • Hey,

    ich habe s hinbekommen über die DLL ein Fenster zu erzeugen 🙂
    Auch Tranparenz und Durchklickbarkeit hab ich hinbekommen.

    Aber 2 kleine Probleme habe ich noch:

    1. Erstelles des Fensters über die DLL

    dort rufe ich folgendes auf:

    void createW(){
    
     const char g_szClassName [] = "My Window Class";
    
    	HINSTANCE hInstance = GetModuleHandle(NULL);
    
    	WNDCLASSEX wc;
    	wc.cbSize = sizeof(WNDCLASSEX);
    	wc.style  = 0;
    	wc.lpfnWndProc = WndProc ;
    	wc.cbClsExtra  = 0;
     	wc.cbWndExtra  = 0;
    	wc.hInstance   = hInstance;
    	wc.hIcon       = LoadIcon  (NULL,IDI_APPLICATION);
    	wc.hCursor     = LoadCursor(NULL,IDC_ARROW);
    	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    	wc.lpszMenuName  = NULL;
    	wc.lpszClassName = g_szClassName;
        wc.hIconSm       = LoadIcon(NULL,IDI_APPLICATION);
    
    	if(!RegisterClassEx(&wc))
    	{
    
            	MessageBox(NULL , "Failed to register window class" ,
                            "Error" , MB_ICONEXCLAMATION | MB_OK );
     	        return;
    
    	}
    
         HWND hwnd;
         hwnd = CreateWindowEx(
                       WS_EX_CLIENTEDGE ,
                       g_szClassName    ,
                       "Title Of Me Window !" ,
                       WS_OVERLAPPEDWINDOW    ,
                       CW_USEDEFAULT , CW_USEDEFAULT , 240 , 120 ,
                       NULL , NULL , 
    				  hInstance , NULL
                );
    
         if(hwnd == NULL)
         {
               MessageBox(NULL , "Failed to create window"
                            , "Error"
                            , MB_ICONEXCLAMATION | MB_OK );
               return ;
         }
    
    	 SetWindowLong(hwnd, 
                  GWL_EXSTYLE, 
                  GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED | WS_EX_TRANSPARENT);
    
          ShowWindow  (hwnd,SW_SHOW);
          UpdateWindow(hwnd);
    
    	MSG Msg;
    	while(GetMessage(&Msg,NULL,0,0)){
    //das hier blockiert mir alles
            	TranslateMessage(&Msg);
            	DispatchMessage (&Msg);
          	}
    
    } 
    
    JNIEXPORT void JNICALL Java_MainClass_NewJFrame_makeWindow(JNIEnv *env, jobject obj){
    
    	createW();
    
     }
    

    In der while schleife unten bleibt er bis das Fenster geschlossen ist, ich kann mit der DLL dann nichts mehr machen .. Muss ich das jeztzt etwa in einen neuen Thread packen oder so? kann doch nicht sein, wie funzt das denn bei normalen Programmen ohne DLL. Diese while Schleife wird ja nie beendet und er hängt da rum 🙂

    2. ich möchte in meinem Tranparenten window Bilder reinmalen(im nachhinein), die sollen dann nicht Tranparent sein. Macht er das Automatisch oder wird einfach alles Tranparent sein?



  • GetMessage() blockiert solange bis es die nächste Nachricht abholen kann.
    (Evtl. brauchst du das gar nicht und das passiert schon irgendwie durch Java)

    Zu WS_EX_LAYERED gehört eigentlich ein Aufruf SetLayeredWindowAttributes() den sehe ich gar nicht?



  • Nee da wird nix durch Java übernommen...
    weiß nicht wie ich das in der DLL realisieren soll, der blokiert alles 🙂

    und zu dem transparenten: ich hab das nur so wie ich es gepostet hab. Es wird ein Fenste erstellt, wlches komplett durchsichtig / durchklickbar ist. Ich möchte in das durchsichtige Fenster jetzt aber ein bild zeichnen, welches dann nicht durchsichtig ist.. jemand einen Tip ?


Anmelden zum Antworten