我正在尝试使用 x86 masm 中的 windows api 打开一个窗口。下面的代码以代码 0 执行,我不明白为什么没有窗口出现。
.code
WindowProc proc wHWND:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
LOCAL wc:WNDCLASSEXA
.if uMsg == 1
mov eax, lParam
mov [wHWND], eax
.elseif uMsg == 2
invoke ExitProcess, 0
.else
invoke DefWindowProcA, wHWND, uMsg, wParam, lParam
ret
.endif
xor eax, eax
ret
WindowProc endp
wWinMain proc hInstance:DWORD, hPrevInstance:DWORD, pCmdLine:DWORD, nCmdShow:DWORD
LOCAL wc:WNDCLASSEXA
mov dword ptr [wc.cbSize], 48
mov eax, 2
or eax, 1
mov dword ptr [wc.style], eax
mov dword ptr [wc.lpfnWndProc], OFFSET WindowProc
mov dword ptr [wc.cbClsExtra], 0
mov dword ptr [wc.cbWndExtra], 0
mov eax, dword ptr [hInstance]
mov dword ptr [wc.hInstance], eax
mov dword ptr [wc.hbrBackground], 5
mov dword ptr [wc.lpszClassName], OFFSET className
lea eax, [wc]
invoke RegisterClassExA, eax
mov eax, 0
or eax, 12582912
or eax, 524288
or eax, 262144
or eax, 131072
or eax, 65536
invoke CreateWindowExA, 0, OFFSET className, OFFSET WindowName, eax, 360, 140, 362, 382, 0, 0, hInstance, 0
mov dword ptr [windowHWND], eax
INVOKE ExitProcess, 0
wWinMain endp
end wWinMain
这只是 asm 的 .code 部分。 wWinMain 是入口点,很多数字是 Windows 枚举并定义,即 12582912,524288,262144,131072,65536
浏览整个文档,模块 1.您的第一个 Windows 程序。
从Windows桌面编程的角度来看,您的应用程序需要消息循环,正如@500-InternalServerError所指出的那样。其余的,正如@IInspectable所说,
您对 CreateWindowExA 的调用未指定 WS_VISIBLE 窗口 样式,因此窗口最初创建时是隐藏的。你不得不 设置 WS_VISIBLE 标志,或调用 ShowWindow 来切换可见性 一点。