I included a .wav file to the project, made a function declaration for the filename and such, plus flags, included mmsystem.h and used a wParam switch statement under WM_KEYUP case label with a VK_ESCAPE function so when you press escape it will call on the PlaySound function but it just makes an error noise when you play it and fails.
Here's the exact code I'm using.....
#include <d3d9.h>
#include <mmsystem.h>
BOOL PlaySound(LPCSTR FILE, HMODULE FLAG, DWORD OTHER);
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pD3DDevice = NULL;
HRESULT InitialiseD3D(HWND hWnd)
{
// First of all, create the main D3D object. If it is created successfully
// we should get a pointer to an IDirect3D8 interface.
g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if(g_pD3D == NULL)
{
return E_FAIL;
}
//Get the current display mode
D3DDISPLAYMODE d3ddm;
if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
{
return E_FAIL;
}
// Create a structure to hold the settings for our device
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
// Fill the structure: Program shall be windowed,
// back buffer format matches current display mode
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = d3ddm.Format;
//Create a Direct3D device.
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pD3DDevice)))
{
return E_FAIL;
}
return S_OK;
}
void Render()
{
if(g_pD3DDevice == NULL)
{
return;
}
// Clear the backbuffer to blue
g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET,
D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);
// Begin the scene
g_pD3DDevice->BeginScene();
// Fill in here the rendering of other objects
// End the scene
g_pD3DDevice->EndScene();
// Fill back and front buffers so that back buffer will be visible on screen
g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
}
void CleanUp()
{
if(g_pD3DDevice != NULL)
{
g_pD3DDevice->Release();
g_pD3DDevice = NULL;
}
if(g_pD3D != NULL)
{
g_pD3D->Release();
g_pD3D = NULL;
}
}
void MainLoop()
{
// Enter the main loop
MSG msg;
BOOL bMessage;
PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);
while(msg.message != WM_QUIT)
{
bMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE);
if(bMessage)
{
// Process message
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Render(); // No message to process -> render the scene
}
}// while
}
// The windows message handler
LRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
case WM_KEYUP:
switch (wParam)
{
case VK_ESCAPE:
// Escape key pressed -> PlaySound should return true.
PlaySound("blah.wav", NULL, SND_FILENAME);
break;
}
break;
}// switch
return DefWindowProc(hWnd, msg, wParam, lParam);
}
// Application main entry point
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
//Register the window class
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WinProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
"DirectX Project", NULL };
RegisterClassEx(&wc);
// Create the application's main window
HWND hWnd = CreateWindow("DirectX Project of mine", "MY project",
WS_OVERLAPPEDWINDOW, 50, 50, 500, 500,
GetDesktopWindow(), NULL, wc.hInstance, NULL);
// Initialize Direct3D
if(SUCCEEDED(InitialiseD3D(hWnd)))
{
// Show window
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
//Start game running: Enter the game loop
MainLoop();
}
CleanUp();
UnregisterClass("DirectX Project", wc.hInstance);
return 0;
}
Anyone have an idea what the issue could be, besides DirectX's interference?
Also, it's not the fact that I'm not using <windows.h>. DirectX's <d3d9.h> includes it itself, so it's not that problem.






