Window messages



  • Wie erzeuge ich ein Window dass window messages erhält?

    WNDCLASS wc;
    	  // Create a dummy window
    	  wc.style = 0;
    	  wc.lpfnWndProc = (WNDPROC)OwnWindowProc;
    	  wc.cbClsExtra = 0;
    	  wc.cbWndExtra = 0;
    	  wc.hInstance = hInstance;
    	  wc.hIcon = 0;
    	  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    	  wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    	  wc.lpszMenuName = 0;
    	  wc.lpszClassName = _T("DummyWin");
    	  RegisterClass(&wc);
    
    	  setup = CreateWindow(
    		  _T("DummyWin"), _T("Dummy"), (DWORD)0, 
    	   0, 0, 1000, 1000, 
    	   NULL, NULL, hInstance, NULL);
    

    Dieses Dummy window emfängt keine messages bei PostMessage..
    Wenn ich es visible mache gehts, aber das will ich nicht.
    Die message kommt von einer Dll über PostMessage(WindowHandle,MsgCode,0,0)
    Wenn ich direkt in der Exe das mache dann funktionierts!
    Wie kann ich das ändern??



  • PostMessage funktioniert nur innerhalb des selben Threads. Willst du von einem anderen Thread eine Nachricht schicken, musst du PostThreadMessage verwenden.



  • groovemaster schrieb:

    PostMessage funktioniert nur innerhalb des selben Threads. Willst du von einem anderen Thread eine Nachricht schicken, musst du PostThreadMessage verwenden.

    Wenn ich von der DLL zur EXE eine Message schicken will verwende ich PostThreadMessage ?

    Msdn:
    The PostMessage function places (posts) a message in the message queue associated with the thread that created the specified window

    Das sollte doch zum richtien Thread geschickt werden mit PostMessage, oder nicht?



  • groovemaster schrieb:

    PostMessage funktioniert nur innerhalb des selben Threads. Willst du von einem anderen Thread eine Nachricht schicken, musst du PostThreadMessage verwenden.

    Also, ich hab einiges probiert mittlerweile, so siehts nun aus:

    Situation ist so:
    DLL die einen Mouse hook implementiert, bei einem Mouse event benachrichtigt die DLL die EXE.

    LRESULT CALLBACK MouseTracker(int code, WPARAM wParam, LPARAM lParam) {
    
    PostThreadMessage(g_dwThreadId,g_nMsgId,0,0);//Funktionierte bei mir nicht.
    PostMessage(g_hWnd,g_nMsgId,0,0); //Funktioniert, aber nur wenn HWND aktiv ist, ich möchte das Window jedoch nicht VISIBLE haben.
    }
    

    Im MainProg habe ich eine WndProc, diese bekommt die Nachricht nur wenn ich PostMessage verwende und dabei das HWND aktiv ist.
    Die Nachricht muss aber immer zur WndProc gelangen, auch wenn das Window Invisible ist. Aber wie??

    Zu CreateWindow:

    HWND CreateWindow(
    ...
      HWND hWndParent,      // handle to parent or owner window
    ...
    );
    

    Ich gebe beim dummy window (invisible) als Parent NULL mit, richtig?

    Wenn ich vor Postmessage einfüge:

    ::IsWindow(g_hWnd);
    

    Es wird FALSE returned falls das Window nicht aktiviert ist, TRUE wird returned wenn es aktiviert ist.



  • ARRRRRRGHHHHHHH!!!

    static HWND g_hWnd;  //funktioniert nicht!
    static HWND g_hWnd = NULL; //funktioniert problemlos!
    

    Variable war nicht initialisiert, dadurch der Fehler.



  • rewe schrieb:

    PostThreadMessage(g_dwThreadId,g_nMsgId,0,0);//Funktionierte bei mir nicht.
    

    Zeig mal, wo und wie du g_dwThreadId initialisierst. Und welchen Status liefert GetLastError() nach PostThreadMessage.


Anmelden zum Antworten