PlaySound - Frage



  • Hi,

    hab grad ein bisschen mit PlaySound rumgespielt weils bei mir nicht gleich klappen wollte. Ich muss dazu sagen dass ich noch nicht so fit bin in C++.
    Jetzt hab ich eine kleine Frage, aber vorher erstmal ein Stück Quelltext:

    #define STRICT
    
    #include <windows.h>
    #include <mmsystem.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    const char szAppName[] = "Testfenster";
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
    	HWND		hWnd;
    	MSG			msg;
    	WNDCLASS	wc;
    
    	wc.style		= CS_HREDRAW | CS_VREDRAW;
    	wc.lpfnWndProc	= WndProc;
    
    	wc.cbClsExtra    =  0;
    	wc.cbWndExtra    =  0;
    
    	wc.hInstance     =  hInstance;
    	wc.hCursor       =  LoadCursor(NULL,IDC_ARROW);
    	wc.hIcon         =  LoadIcon(NULL,IDI_APPLICATION);
    	wc.hbrBackground =  (HBRUSH)GetStockObject(WHITE_BRUSH);
    
    	wc.lpszClassName =  szAppName;
        wc.lpszMenuName  =  NULL;
    
    	RegisterClass(&wc);
    
    	hWnd = CreateWindow(szAppName,
                           "Testfenster",
                           WS_OVERLAPPEDWINDOW,
                           CW_USEDEFAULT,          /* X-Position auf dem Monitor */
                           CW_USEDEFAULT,          /* Y-Position auf dem Monitor */
                           500,          /* Fensterbreite              */
                           500,          /* Fensterhoehe               */
                           NULL,
                           NULL,
                           hInstance,
                           NULL);
    	PlaySound("lol.wav", NULL, SND_FILENAME | SND_ASYNC);
    	ShowWindow(hWnd, iCmdShow);
        UpdateWindow(hWnd);
    
    	while (GetMessage(&msg, NULL, 0, 0))
        {
    		TranslateMessage(&msg);
          DispatchMessage(&msg);
        }
    	return msg.wParam;
    
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	 switch (message)
       {
    		 case WM_DESTROY:
          {
             PostQuitMessage(0);
             return 0;
          }
       }
    	  return DefWindowProc(hWnd, message, wParam, lParam);
    }
    

    So klappt das mit PlaySound.
    Aber wenn ich es an einer anderen Stelle einbaue klappt es auf einmal nicht mehr:

    #define STRICT
    
    #include <windows.h>
    #include <mmsystem.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    const char szAppName[] = "Testfenster";
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
    	HWND		hWnd;
    	MSG			msg;
    	WNDCLASS	wc;
    
    	wc.style		= CS_HREDRAW | CS_VREDRAW;
    	wc.lpfnWndProc	= WndProc;
    
    	wc.cbClsExtra    =  0;
    	wc.cbWndExtra    =  0;
    
    	wc.hInstance     =  hInstance;
    	wc.hCursor       =  LoadCursor(NULL,IDC_ARROW);
    	wc.hIcon         =  LoadIcon(NULL,IDI_APPLICATION);
    	wc.hbrBackground =  (HBRUSH)GetStockObject(WHITE_BRUSH);
    
    	wc.lpszClassName =  szAppName;
        wc.lpszMenuName  =  NULL;
    
    	RegisterClass(&wc);
    
    	hWnd = CreateWindow(szAppName,
                           "Testfenster",
                           WS_OVERLAPPEDWINDOW,
                           CW_USEDEFAULT,          /* X-Position auf dem Monitor */
                           CW_USEDEFAULT,          /* Y-Position auf dem Monitor */
                           500,          /* Fensterbreite              */
                           500,          /* Fensterhoehe               */
                           NULL,
                           NULL,
                           hInstance,
                           NULL);
    
    	ShowWindow(hWnd, iCmdShow);
        UpdateWindow(hWnd);
    
    	while (GetMessage(&msg, NULL, 0, 0))
        {
    		TranslateMessage(&msg);
          DispatchMessage(&msg);
        }
    	return msg.wParam;
    
       PlaySound("lol.wav", NULL, SND_FILENAME | SND_ASYNC);
    
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	 switch (message)
       {
    		 case WM_DESTROY:
          {
             PostQuitMessage(0);
             return 0;
          }
       }
    	  return DefWindowProc(hWnd, message, wParam, lParam);
    }
    

    Warum ist das so?

    Danke schonmal,

    Patrick 🙂



  • Die Funktion PlaySound im zweiten Dings wird nie abgespielt, weil sie hinter dem "return" steht. Der Computer führt den Code halt bis zum "return" aus und springt dann dahin zurück, von wo aus die Funktion aufgerufen wurde.



  • Achso, stimmt ja.

    Aber wenn ich es nach der while-Schleife einfüge funktioniert es auch nicht.
    Also so:

    while (GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
          DispatchMessage(&msg);
        }
        PlaySound("lol.wav", NULL, SND_FILENAME | SND_ASYNC);
        return msg.wParam;
    


  • Direkt nach PlaySound() ist dein Programm auch beendet. Vermutlich wird PlaySound() da abgebrochen. Nimm da mal das SND_ASYNC raus 😉



  • Wenn ich das rausnehme spinnt das Programm ein bisschen. Ich kann nämlich nicht sofort wieder das Programm über das x rechts oben schliessen. Wenn ich da drauf klicke kommt die Fehlermeldung von Windows zum sofort beenden.



  • Kein Wunder, dein Programm kann dann auch keine Messages mehr bearbeiten bis PlaySound() fertig ist. Eben deswegen gibt es ja SND_ASYNC...



  • sag mal was versuchst du denn? Wieso spielst du den Sound nach deiner Message Schleife ab? Willst du den Sound beim Beenden des Programms abspielen? Dann reagiere auf die WM_CLOSE oder WM_DESTROY Nachricht.

    schirrmie


Anmelden zum Antworten