Can you tell why this code doesn't subclass the window?

Code:
#include <windows.h>

#define WIN32_LEAN_AND_MEAN

static HINSTANCE hInstance = NULL;
char szClassName[] = "StartButton";

HWND hwndTask;
HWND hwndStart;
WNDPROC wpOldStBtnProc;

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam,
								 LPARAM lParam);

LRESULT APIENTRY wpNewStBtnProc(HWND hwnd, UINT message, WPARAM wParam, 
								LPARAM lParam);

// main window procedure
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
				   LPSTR lpszArgument, int nCmdShow){
	
	HWND hwnd;	// main window handle
    MSG messages;
    WNDCLASSEX wincl;
    wincl.hInstance = hInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure; 
    wincl.style = CS_DBLCLKS;
    wincl.cbSize = sizeof(WNDCLASSEX);
	wincl.hIcon = LoadIcon(NULL, IDI_WINLOGO);
    wincl.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
    wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
	wincl.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;
	
    if(!RegisterClassEx(&wincl)) return 0;
	
    hwnd = CreateWindowEx(0, szClassName, "Start Button", WS_OVERLAPPEDWINDOW, 
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
		HWND_DESKTOP, NULL,	hInstance, NULL);
	
    ShowWindow(hwnd, nCmdShow);
    while(GetMessage(&messages, NULL, 0, 0))
		
		
	{
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
    return messages.wParam;
}

// callback procedure
LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam,
								 LPARAM lParam){
    switch(message){
	case WM_CREATE:
		hwndTask = FindWindowEx(0, 0, "Shell_TrayWnd", 0);
		hwndStart = FindWindowEx(hwndTask, 0, "Button", 0);
		
		if(hwndStart != NULL){
			wpOldStBtnProc = (WNDPROC) SetWindowLong(hwndStart,
				GWL_WNDPROC, (LONG) wpNewStBtnProc);
		}
		else{
			MessageBox(NULL, "Failed to Subclass!", "Error", NULL);
		}
		
		break;
		
	case WM_COMMAND:
        break;
		
	case WM_DESTROY:
		SetWindowLong(hwndStart, GWL_WNDPROC, 
			(LONG) wpOldStBtnProc); 
		
		DestroyWindow(hwnd);
        PostQuitMessage(0);
        break;
        
	default:
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
}


// Subclass procedure 
// IS NOT WORKING
LRESULT APIENTRY wpNewStBtnProc(HWND hwnd, UINT message, WPARAM wParam, 
								LPARAM lParam) 
{
	MessageBox(NULL, "New procedure", "Success", NULL);
	
	
	return CallWindowProc(wpOldStBtnProc, hwnd, message, wParam, lParam); 
}