Well. My problem is really really confusing and I don't get it really. Basically, I have a little thing that I paint to the screen, and move it around with the arrow keys. When I, for example, am notified that the right arrow key is pressed, I get a WM_KEYDOWN, and I start a timer which slowly increments to speed of the object, accelerating it. When I get the WM_KEYUP of the right arrow key, I kill the timer. Here is how it is implemented. Scroll to the bottom for description of my problem.

Code:
		case WM_KEYDOWN:
			try
			{
				Thingy & t = s.find(ID_CIRCLE);
				switch(wParam)
				{
					case VK_RIGHT:
						if(!::SetTimer(hwnd, ID_RIGHTARROW, 100, NULL))
						{
							ErrorMessage(_T("%d"), ::GetLastError());
						}
						break;

					case VK_LEFT: 
						::SetTimer(hwnd, ID_LEFTARROW, 100, NULL);
						break;
				}
				
				t.move();
				s.update();

				::InvalidateRect(hwnd, NULL, TRUE);
			}

			catch(std::exception & e) {
				ErrorMessage(_T("Error: %d"), e.what());
			}
			break;

		case WM_KEYUP:
			switch(wParam)
			{
				case VK_RIGHT:
					::KillTimer(hwnd, ID_RIGHTARROW);
					break;

				case VK_LEFT:
					::KillTimer(hwnd, ID_LEFTARROW);
					break;
			}
			break;

		case WM_TIMER:
			try
			{
				Thingy & t = s.find(ID_CIRCLE);
				switch(wParam)
				{
					case ID_RIGHTARROW:
						t.setSpeed(t.getXSpeed() + 1, t.getYSpeed());
						break;

					case ID_LEFTARROW:
						t.setSpeed(t.getXSpeed() - 1, t.getYSpeed());
						break;
				}		

				TCHAR buf[256];
				wsprintf(buf, _T("%d\n"), t.getXSpeed());
				::OutputDebugString(buf);
			}			

			catch(std::exception & e) {
				ErrorMessage(_T("Error: %d"), e.what());
			}
			break;
Okay. So, I output the speed of my object, and here's how the debug output looks, with commenting on what I'm doing.

Code:
-1 // I press VK_LEFT, and hold it for awhile.
-2
-3
-4 // Still holding VK_LEFT, it stops accelerating to a greater but still moves. I let go of VK_LEFT and press VK_RIGHT
-3
-2
-1
0 // Decelerates until 0, then stops decelerating. Again, even as I'm holding VK_RIGHT. I keyup, and press VK_RIGHT again.
1
2
3
4 // It accelerates up 4 more, and stops. I keyup, and press VK_RIGHT again.
5
6
7
8 // 4 more. Stops. You get the idea.
I figured out I get multiple WM_KEYDOWN messages while I'm holding it, and figured SetTimer would be failing, but it isn't. I can't tell what's going on with this, it's really illogical.