52 WindowLongPtrStacker::WindowLongPtrStacker(
int index, LONG_PTR value)
59 void WindowLongPtrStacker::Push(HWND hWndArg)
65 oldValue = SetWindowLongPtr(hWnd, nIndex, newValue);
66 if (!oldValue && GetLastError()) {
67 throw MSXException(
"SetWindowLongPtr failed");
71 void WindowLongPtrStacker::Pop()
76 LONG_PTR removedValue = SetWindowLongPtr(hWnd, nIndex, oldValue);
77 if (!removedValue && GetLastError()) {
78 throw MSXException(
"SetWindowLongPtr failed");
80 assert(removedValue == newValue);
84 LONG_PTR WindowLongPtrStacker::GetOldValue()
89 WindowLongPtrStacker AltSpaceSuppressor::procStacker(
91 reinterpret_cast<LONG_PTR>(InterceptorWndProc));
93 void AltSpaceSuppressor::Start(HWND hWnd)
95 procStacker.Push(hWnd);
98 void AltSpaceSuppressor::Stop()
103 LRESULT AltSpaceSuppressor::InterceptorWndProc(
104 HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
107 if (SuppressAltSpace(hWnd, message, wParam, lParam, &lResult)) {
113 auto nextWndProc =
reinterpret_cast<WNDPROC
>(procStacker.GetOldValue());
116 return CallWindowProc(nextWndProc, hWnd, message, wParam, lParam);
120 return DefWindowProc(hWnd, message, wParam, lParam);
123 bool AltSpaceSuppressor::SuppressAltSpace(
124 HWND , UINT message, WPARAM wParam, LPARAM lParam,
127 if (message == WM_SYSCOMMAND &&
128 wParam == SC_KEYMENU &&
129 lParam == LPARAM(
' ')) {
Thanks to enen for testing this on a real cartridge: