I'm building an app, and I use my own event queue. Everything works fine, except, that sometimes no mouse_up message is being sent when releasing a mouse button. I don't have a clue what the problem is. Can anyone help me ?

The error is in this part of the code :
Code:
Event temp;
void read_events(){
	int i;

	resetEvent(&temp);
	if(getMouseEvent()){
		copyEventToList(G->event, &temp);
	}
	resetEvent(&temp);
	if(getMouseMoveEvent()){
		copyEventToList(G->event, &temp);
	}

	handleWindowsEvents();
}

int getMouseEvent(){
	MSG msg;
	int muisx, muisy;

	if(PeekMessage(&msg, getHwnd(), 0, 0, PM_NOREMOVE)){
		getScaledMouseCoordinates(&muisx, &muisy);

		if (msg.message == WM_LBUTTONDOWN){
			temp.event = GUI_MOUSE_LEFT_DOWN;
			temp.val1 = muisx;
			temp.val2 = muisy;
			return 1;
		}
		else if (msg.message == WM_MBUTTONDOWN){
			temp.event = GUI_MOUSE_MIDDLE_DOWN;
			temp.val1 = muisx;
			temp.val2 = muisy;
			return 1;
		}
		else if (msg.message == WM_RBUTTONDOWN){
			temp.event = GUI_MOUSE_RIGHT_DOWN;
			temp.val1 = muisx;
			temp.val2 = muisy;
			return 1;
		}
		else if (msg.message == WM_LBUTTONUP){
			temp.event = GUI_MOUSE_LEFT_UP;
			temp.val1 = muisx;
			temp.val2 = muisy;
			return 1;
		}
		else if (msg.message == WM_MBUTTONUP){
			temp.event = GUI_MOUSE_MIDDLE_UP;
			temp.val1 = muisx;
			temp.val2 = muisy;
			return 1;
		}
		else if (msg.message == WM_RBUTTONUP){
			temp.event = GUI_MOUSE_RIGHT_UP;
			temp.val1 = muisx;
			temp.val2 = muisy;
			return 1;
		}
	}
	return 0;
}

int getMouseMoveEvent(){
	MSG msg;
	int muisx, muisy;

	if(PeekMessage(&msg, getHwnd(), 0, 0, PM_NOREMOVE)){
		getScaledMouseCoordinates(&muisx, &muisy);

		if (msg.message == WM_MOUSEMOVE){
			temp.event = GUI_MOUSE_MOVE;
			temp.val1 = muisx;
			temp.val2 = muisy;
			return 1;
		}
	}
	return 0;
}

void doWindowsEvents(){
	MSG msg;

	if(PeekMessage(&msg, getHwnd(), 0, 0, PM_REMOVE)){
		if ((msg.message == WM_SYSKEYDOWN) || (msg.message == WM_KEYDOWN)){
		}
		else if ((msg.message == WM_SYSKEYUP) || (msg.message == WM_KEYUP)){
		}
		else if (msg.message == WM_CHAR){
		}
		else if (msg.message == WM_DEADCHAR){
		}
		else if (msg.message == WM_SYSDEADCHAR){
		}
		else if (msg.message == WM_LBUTTONDOWN){
		}
		else if (msg.message == WM_MBUTTONDOWN){
		}
		else if (msg.message == WM_RBUTTONDOWN){
		}
		else if (msg.message == WM_LBUTTONUP){
		}
		else if (msg.message == WM_MBUTTONUP){
		}
		else if (msg.message == WM_RBUTTONUP){
		}
		else if (msg.message == WM_MOUSEMOVE){
		}
		else if (msg.message == WM_SETCURSOR){
		}
		else if (msg.message == WM_NCMOUSEMOVE){
		}
		else if (msg.message == WM_NCHITTEST){
		}
		else if (msg.message == WM_CLOSE){
		}
		else if (msg.message == WM_ACTIVATE){
		}
		else if (msg.message == WM_PAINT){
		}
		else if (msg.message == WM_CAPTURECHANGED){
		}
		else if (msg.message == WM_SIZE){
		}
		else if (msg.message == WM_WINDOWPOSCHANGED){
		}
		else if (msg.message == WM_MOVE){
		}
		else if (msg.message == WM_ERASEBKGND){
		}
		else if (msg.message == WM_NCPAINT){
		}
		else if (msg.message == WM_NCACTIVATE){
		}
		else if (msg.message == WM_DESTROY){
		}
		else if (msg.message == WM_NCDESTROY){
		}
		else if (msg.message == WM_KILLFOCUS){
		}
		else if (msg.message == WM_SHOWWINDOW){
		}
		else if (msg.message == WM_WINDOWPOSCHANGING){
		}
		else if (msg.message == WM_SETFOCUS){
		}
		else if (msg.message == WM_MOVING){
		}
		else if (msg.message == WM_ENTERSIZEMOVE){
		}
		else if (msg.message == WM_GETTEXT){
		}
		else if (msg.message == WM_ACTIVATEAPP){
		}
		else if (msg.message == WM_TIMER){
		}
		else{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
}
Thanks in advance.