HWND und Message Problem



  • ++C++ schrieb:

    soweit so gut, aber wie krieg ich es jetzt hin das ich die Message empfangen kann ohne dass ich ein (Dialog)Fenster machen muss?

    Was hast du gegen Fenster 😃



  • geeky schrieb:

    Was hast du gegen Fenster 😃

    Man muß sie putzen 😃

    Also er will Hook und HotKey, wobei man ein HWND benötigt, aber er erstellt kein Fenster, oder will es nicht.
    Wenn du kein Fenster willst (sichtbar) dann mach es Unsichtbar (Forensuche) und deine Probleme gehören der Vergangenheit an.
    Und wenn du strckt kein CreateWindow verwenden willst, nimm den Desktop (HWND - NULL) setzte mit SetWindowLong eine eigene WndProc an dessen ende die alte des Desktop aufgerufen wird, ob das klappt, weiß ich nicht, aber du wirst es für uns rausfinden, ja. 🙂



  • Ich wiß, sorry, scheiße erklährt...

    also, ich will ein Programm schreiben das aus einer ini datei den Title eines vorhandenen Fensters einliest, im hintergrund leuft (daemon) und jedes mal wenn man STRG drückt das Fenster Unsichtbar (ShowWindow(...,SW_HIDE))
    bzw. sichtbar (ShowWindow(...,SW_SHOW)) macht.

    Ich werd jetzt einfach mal den bisherigen Quellqode posten der allerdings
    durch öffteres Überarbeiten 1. Schwachsinnig ist und 2. Unübersichtlich
    aber vileicht versteht man dan was ich meine:

    #include <stdio.h>
    #include <windows.h>
    #include <commctrl.h>
    #include "resource.h"
    
    #define HT_CRTL WM_USER
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    BOOL CALLBACK HelpProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
    
    int i;
    HINSTANCE hinstance;
    HDC hdc;
    
    WINAPI WinMain (HINSTANCE hinstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int nCmdShow)
    {
    	char title[100];
    	DWORD size=255;
    	HWND hwnd;
    	MSG msg;
    	WNDCLASS wnd;
    	HWND hwnd1;
    
    	GetPrivateProfileString("Programm","Programmtitlezeile","",title,size,"./Programm.ini");
    
    	hwnd=FindWindow(NULL,title);
    
    	MessageBox(NULL,title,"",MB_OK);
    
    	if(hwnd==NULL)
    	{
    		MessageBox(NULL,"Fenster kann nicht gefunden werden...","Fehler",MB_ICONERROR);
    	}
    
    	else
    	{
    		static TCHAR szAppName[] = TEXT ("Invisible - Tool");    //hier fängt der Schwachsinn an
    
    		wnd.style = CS_HREDRAW | CS_VREDRAW;
    		wnd.lpfnWndProc = WndProc;
    		wnd.cbClsExtra = 0;
    		wnd.cbWndExtra = DLGWINDOWEXTRA;
    		wnd.hInstance = hinstance;
    		wnd.hIcon = NULL;
    		wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
    		wnd.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
    		wnd.lpszMenuName = "IDM_MENU";
    		wnd.lpszClassName = szAppName;
    
    		if (!RegisterClass (&wnd)) { MessageBox(NULL, "RegisterClass failor", "ERROR", MB_ICONERROR); }
    
    		hwnd1 = CreateWindow(szAppName,NULL,NULL,0,0,0,NULL,NULL,hinstance,NULL);     //Absoluter Schwachsinn :)
    
    		if(hwnd1==NULL) { MessageBox(NULL, "CreatDialog() failor", "ERROR", MB_ICONERROR); }
    
    		if(!RegisterHotKey(hwnd1, HT_CRTL, 2, NULL)) { MessageBox(NULL, "RegisterHotKey() failor", "ERROR", MB_ICONERROR); }
    
    		while(GetMessage(&msg, NULL, 0, 0))
    		{
    			TranslateMessage (&msg);
    			DispatchMessage (&msg);
    		}
    	}
    
    	return 0;
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	if (i!=1) { i=0; }
    
    	switch(message)
    	{
    	case WM_CREATE:
    		break;
    
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		break;
    
    	case WM_HOTKEY:
    	{
    		switch(wParam)
    		{
    		case HT_CRTL:
    			if(i==0)
    			{
    				ShowWindow(hwnd, SW_HIDE);
    				i=1;
    				break;
    			}
    
    			if(i==1)
    			{
    				ShowWindow(hwnd, SW_SHOW);
    				i=0;
    			}
    			break;
    		}
    
    		break;
    	}
    	}
    
    	return DefWindowProc (hwnd, message, wParam, lParam);
    }
    


  • @MiC++ha

    An das mit dem unsichtbaren Fenster hab ich auch schon gedacht, aber obwohl da hat ich immer nen CreatDialog Fehler...



  • Sag mal gehst du beim Coden logisch vor, oder bastelst du immer so und so rum und schreibst als Komentar dann hinter "//Schwachsinn"

    guck dir das mit dem unsichtbaren Fenster nochmal genau an, oder verwende einen modalen Dialog den du unsichtbar machst, aber in deinem Code sehe ich auch nichts von einem Dialog?

    Dein Code, so wie er hier vorliegt, ist im Buch der WinAPI Witze auf Seite 204 abgedruckt.
    Wir werden dir sicher helfen, aber dazu muß du erst deine Gedanken reinigen und den Code löschen.
    Jetzt fängst du von neuem an, schritt für schritt und mit reichlich überlegung, und wenn du nicht weißt ob A auch das tut wenn B=C ist, dann fragst du, aber rumfummeln ohne Logic, bringt dich nicht weiter.

    Am besten finde ich:

    hwnd1 = CreateWindow(szAppName,NULL,NULL,0,0,0,NULL,NULL,hinstance,NULL);
    

    Warum nicht gleich CreateNull()

    Du kannst auch MoveWindow(hwndl,0,0,0,0,true) verwenden, nur dann hast du den Button in der Taskleiste noch, aber auch das lässt sich bewergsteligen, viele Wege führen nach Rom.
    Guck dir diese Sachen mit dem Fenster verstecken noch mal genau an, auch andere Beispiele.



  • Lässt sich das überhaupt kompilieren ? - Mir scheint als würde bei CreateWindow z.B. nen Parameter fehlen...



  • geeky schrieb:

    Lässt sich das überhaupt kompilieren ? - Mir scheint als würde bei CreateWindow z.B. nen Parameter fehlen...

    Ich probiere das nicht aus, ich liebe mein Computer 😃

    Edit: stimmt, CreateWindow erwartet 11 Parameter, da sind nur 10.



  • OK, des mit CreatWindow() funzt jetzt aber er macht jetzt das unsichtbare Fenster unsichtbar, bzw. sichtbar obwohl es hwnd1 hat und nicht hwnd 😞



  • Für WM_HOTKEY Nachrichten brauchst du kein Fenster erstellen. Da diese gepostet werden kannst du sie in der Nachrichtenschleife behandeln.

    MSG message;
    while(GetMessage(&message, NULL, 0, 0))
    {
        if(message.message == WM_HOTKEY)
        {
            // deine Aktion
        }
    
        TranslateMessage(&message);
        DispatchMessage(&message);
    }
    


  • Ich glaub ich verstehe jetzt was du vorhast!

    Du machst einen kleinen Fehler:
    Wenn dein unsichtbares Fenster die HT_CTRL Nachricht erhält, wird ja die WndProc() des unsichtbaren Fensters aufgerufen.
    Nun ist deine WndProc() ja so aufgebaut:
    LRESULT CALLBACK WndProc (HWND hwnd (<-!!), UINT message, WPARAM wParam, LPARAM lParam)
    Wenn du in der WndProc jetzt ShowWindow(hwnd, SW_HIDE); aufrufst - ist dein hwnd nicht dasselbe wie in der WinMain!!!
    Deine WndProc kennt das hwnd aus der WinMain überhaupt nicht!

    Du müsste also dein "hwnd" als globale Variable anlegen, die du z.B.
    controlWnd oder so nennst...



  • Steht ja auch beim hWnd Parameter:

    If this parameter is NULL, WM_HOTKEY messages are posted to the message queue of the calling thread and must be processed in the message loop.



  • ++C++ schrieb:

    OK, des mit CreatWindow() funzt jetzt aber er macht jetzt das unsichtbare Fenster unsichtbar, bzw. sichtbar obwohl es hwnd1 hat und nicht hwnd 😞

    Sag mal niemmst du Drogen? 👎

    @Ungetest
    nimmst du auch welche? 👎
    Für HotKeyRegistrierung brauch ich ein HWND, und für die MesageLoop auch.

    @++c++
    schmeiß den Code über bord und fummel da drinn nicht mehr rum, das bringt nichts, mach das vernünftig von vorn, wir helfen dann auch, aber nicht mit diesem Code als Grundlage.

    @geeky
    Hilfst du mit, wenn er den Code weg schmeißt?
    Obwohl, wo für eigentlich? Das machen wir Samstagnacht wenn wir vom Saufen kommen. 😃



  • MiC++ha: dumm? Das steht in der MSDN das es kein HWND brauch.



  • ungetestet schrieb:

    MiC++ha: dumm? Das steht in der MSDN das es kein HWND brauch.

    Was braucht kein HWND?
    Die Nachrichten abfrage? ja
    HotKey setzten, nein
    Mit MessageLoop meinte ich die "WndProc" 😉 war unglücklich ausgedrückt
    und dafür brauch ich wieder ein HWND.

    Mal anders gefragt, was pasiert bei Windows wenn ich kein Window erstelle?



  • Mal anders gefragt, was pasiert bei Windows wenn ich kein Window erstelle?

    Sag mal nimmst du Drogen? 🤡 👎



  • ++FU++ schrieb:

    Mal anders gefragt, was pasiert bei Windows wenn ich kein Window erstelle?

    Sag mal nimmst du Drogen? 🤡 👎

    Die Frage war schon ernst gemeint, btw. darauf bezogen zu vermeiden das ein Konsolenfenster aufgeht. Viele wissen es nicht, aber wie auch immer, ich liebe ja diese Gegensprüche von Unregistrierten, die dann bei konkreten Fragen nicht mehr Antworten können.



  • Stell mal deine Frage vernünftig.



  • Marita schrieb:

    Stell mal deine Frage vernünftig.

    Wenn meinst du jetzt damit?



  • Deine Micha.

    was pasiert bei Windows wenn ich kein Window erstelle?



  • Platform SDK schrieb:

    The system automatically creates a message queue for each thread. If the thread creates one or more windows, a message loop must be provided; this message loop retrieves messages from the thread's message queue and dispatches them to the appropriate window procedures.

    Because the system directs messages to individual windows in an application, a thread must create at least one window before starting its message loop. Most applications contain a single thread that creates windows. A typical application registers the window class for its main window, creates and shows the main window, and then starts its message loop — all in the WinMain function.

    You create a message loop by using the GetMessage and DispatchMessage functions. If your application must obtain character input from the user, include the TranslateMessage function in the loop. TranslateMessage translates virtual-key messages into character messages. The following example shows the message loop in the WinMain function of a simple Windows-based application.

    Hmm, nu bin ich nich schlüssig 😉
    Man kann also ne Hotkey-Nachricht kriegen ohne ein Fenster erzeugt zu haben ?
    Was laut Doku von RegisterHotKey() einleuchtend klingt, aber wieder irgendwie widersprüchlich mit "a thread must create at least one window before starting its message loop." klingt...
    Naja, ich vermute mal DispatchMessage() in der message-loop wird dann eben die WndProc() gar nicht aufrufen, aber was steht dann in der MSG-Struktur als HWND ? - NULL ?


Anmelden zum Antworten