从 Console Build All 菜单构建;
代码;
.386 .model flat, stdcall option casemap :none include S:\masm32\include\windows.inc include S:\masm32\include\user32.inc include S:\masm32\include\kernel32.inc include S:\masm32\include\gdi32.inc includelib S:\masm32\lib\user32.lib includelib S:\masm32\lib\kernel32.lib includelib S:\masm32\lib\gdi32.lib .data FindName db "计算器",0h eName db "calc",0h handle dd ? .code start: invoke FindWindow,NULL,addr FindName mov handle,eax .if(handle != 0) ; 找到则最小化窗口 invoke ShowWindow,handle,SW_SHOWMINIMIZED .else ; 没有找到则打开进程 invoke WinExec, addr eName ,SW_SHOW .endif invoke ExitProcess,NULL end start运行;第一次运行c3.exe,如果没有打开 计算器,则会打开计算器;第二次运行c3.exe,则会最小化 计算器 窗口;
窗口显示方式的定义如下;
ShowWindow 函数显示方式(第二个参数)的定义:
预定义值 等 效 值 SW_HIDE 隐藏窗口,大小不变,激活状态不变 SW_MAXIMIZE 最大化窗口,显示状态不变,激活状态不变 SW_MINIMIZE 最小化窗口,显示状态不变,激活状态不变 SW_RESTORE 从最大化或最小化恢复正常大小,显示状态不变,激活状态不变 SW_SHOW 显示并激活窗口,大小状态不变 SW_SHOWMAXIMIZED 显示并激活窗口,以最大化显示 SW_SHOWMINIMIZED 显示并激活窗口,以最小化显示 SW_SHOWMINNOACTIVE 显示窗口并最小化,激活状态不变 SW_SHOWNA 显示窗口,大小状态不变,激活状态不变 SW_SHOWNOACTIVATE 显示并从最大化或最小化恢复正常大小,激活状态不变 SW_SHOWNORMAL 显示并激活窗口,恢复正常大小(初始化时用这个参数)
运行情况如下;
代码;
.386 .model flat, stdcall option casemap :none include S:\masm32\include\windows.inc include S:\masm32\include\user32.inc include S:\masm32\include\kernel32.inc include S:\masm32\include\gdi32.inc includelib S:\masm32\lib\user32.lib includelib S:\masm32\lib\kernel32.lib includelib S:\masm32\lib\gdi32.lib .data stStartUp STARTUPINFO <?> .const szCaption db '当前目录',0 .code start: invoke GetStartupInfo,addr stStartUp ;mov eax,stStartUp.lpDesktop ;mov eax,stStartUp.lpTitle ; 当前软件目录 invoke MessageBox, NULL, stStartUp.lpTitle, addr szCaption, MB_OK invoke ExitProcess,NULL end start代码如下;
.386 .model flat, stdcall option casemap :none include S:\masm32\include\windows.inc include S:\masm32\include\user32.inc include S:\masm32\include\kernel32.inc include S:\masm32\include\gdi32.inc includelib S:\masm32\lib\user32.lib includelib S:\masm32\lib\kernel32.lib includelib S:\masm32\lib\gdi32.lib .data systime SYSTEMTIME <?> .const szCaption db '当前时间',0 .code start: invoke GetLocalTime,addr systime ; 获取当前时间 ;mov ax,systime.wYear ;mov bx,systime.wMonth ;mov cx,systime.wDay ;invoke SetLocalTime,addr systime ; 设置当前时间 invoke MessageBox, NULL, systime.wMonth, addr szCaption, MB_OK invoke ExitProcess,NULL end start如前构建,构建成功;但是运行,不会显示消息框;为什么?
看一下结构体的定义;
typedef struct _STARTUPINFO { DWORD cb; PSTR lpReserved; PSTR lpDesktop; PSTR lpTitle; DWORD dwX; DWORD dwY;
DWORD dwXSize; DWORD dwYSize; DWORD dwXCountChars; DWORD dwYCountChars; DWORD dwFillAttribute; DWORD dwFlags; WORD wShowWindow; WORD cbReserved2; PBYTE lpReserved2; HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; } STARTUPINFO, *LPSTARTUPINFO;
typedef struct _SYSTEMTIME { WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; WORD wMinute; WORD wSecond; WORD wMilliseconds; } SYSTEMTIME, *PSYSTEMTIME;
程序2获取了以后可以MessageBox出来,因为使用的结构体的字段lpTitle的类型是PSTR,程序3获取了以后,wMonth字段是WORD类型;下回再处理此问题;
问题和程序3一样,不会显示消息框;
如果把
invoke MessageBox, NULL, lpsystem.wProcessorArchitecture, addr szCaption, MB_OK
改为
invoke MessageBox, NULL, addr lpsystem.wProcessorArchitecture, addr szCaption, MB_OK
则显示如下;
下回再处理此问题;
看一下代码,addr lpDrives+4, 加4后显示下一个;
.386 .model flat, stdcall option casemap :none include S:\masm32\include\windows.inc include S:\masm32\include\user32.inc include S:\masm32\include\kernel32.inc include S:\masm32\include\gdi32.inc includelib S:\masm32\lib\user32.lib includelib S:\masm32\lib\kernel32.lib includelib S:\masm32\lib\gdi32.lib .data lpLength BYTE ? lpDrives DWORD 0 dup(1024) .const szCaption db '磁盘信息',0 .code start: invoke GetLogicalDrives ; 获取卷标 invoke GetLogicalDriveStrings,addr lpLength,addr lpDrives ; 同上 ;lea esi,[lpDrives] ; 显示C盘 ;lea esi,[lpDrives+4] ; 显示D盘 invoke MessageBox, NULL, addr lpDrives, addr szCaption, MB_OK invoke MessageBox, NULL, addr lpDrives+4, addr szCaption, MB_OK invoke ExitProcess,NULL end start