Создаю форму: Код (Text): invoke CreateWindowEx,WS_EX_TOOLWINDOW or WS_EX_APPWINDOW or 0,ADDR ClassName,ADDR FormCaption,WS_SYSMENU or WS_CAPTION,362,194,431,81,0,0,hInst,0 как видите это ToolWindow, и соответственно у него нету кнопок минимизации и максимизации. Однако если кликнуть ПКМ на заголовке то в открывшемся меню будут эти пункты: Вопрос: как можно отключить пункты "Развернуть" и "Свернуть"?
Attack, прежде чем постить в форум - ну, хоть по минимуму проверяйте, ага? - у WS_EX_TOOLWINDOW и WS_EX_APPWINDOW - противоположные задачи на таскбаре, зачем? - наверняка у вас не пустой FormCaption, а что на скриншоте, каким макаром? - что за чудовищный отступ у последней строчки сисменю, что вы над ней проделали? Короче, лечите свой недопоказанный код. Или уж выкладывайте сюда весь. И кстати, так что у вас: x64 или х32 ?
kero, время было позднее, да и функций редактирования/удаления сообщений тут нету, что странно. - WS_EX_TOOLWINDOW использую для того, чтобы окно было с узким заголовком. - WS_EX_APPWINDOW использую, чтобы кнопка окна была на панели задач. - FormCaption был пустой(" ",0), теперь вписал банальность: Вот код: Код (Text): .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\gdi32.inc include \masm32\include\comdlg32.inc include \masm32\include\shell32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\comdlg32.lib includelib \masm32\lib\shell32.lib WinMain proto :DWORD,:DWORD,:DWORD,:DWORD RGB macro red,green,blue xor eax,eax mov ah,blue shl eax,8 mov ah,green mov al,red endm szText MACRO Name,Text:VARARG LOCAL lbl jmp lbl Name db Text,0 lbl: ENDM .const .data? hInstance HINSTANCE ? CommandLine LPSTR ? .data ;_______________ ClassName db "Class_name",0 FormCaption db "form caption",0 ;_______________ .code start: invoke GetModuleHandle,NULL mov hInstance,eax invoke GetCommandLine invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT invoke ExitProcess,eax WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc :WNDCLASSEX LOCAL msg :MSG LOCAL hwnd :HWND mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style,CS_BYTEALIGNCLIENT mov wc.lpfnWndProc,offset WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInst pop wc.hInstance mov wc.hbrBackground,COLOR_BTNFACE+1 mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx,addr wc invoke CreateWindowEx,WS_EX_TOOLWINDOW or WS_EX_APPWINDOW or 0,ADDR ClassName,ADDR FormCaption,WS_SYSMENU or WS_CAPTION,362,194,431,81,0,0,hInst,0 mov hwnd,eax INVOKE ShowWindow,hwnd,SW_SHOWNORMAL INVOKE UpdateWindow,hwnd .WHILE TRUE invoke GetMessage,ADDR msg,0,0,0 .BREAK .IF (!eax) invoke TranslateMessage,ADDR msg invoke DispatchMessage,ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM .IF uMsg == WM_DESTROY invoke PostQuitMessage,NULL .ELSEIF uMsg == WM_CREATE .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp end start Пишу на x32, а нормального MASM64 вроде нету, по крайней мере на официальном сайте. А на FASM переходить пока не охота.
1) Прежде всего условимся, что "формы" остались в дельфи. В Win32 API - окна. 2) Системное меню окна действительно не без сюрпризов. Дело в том, что состав системного меню и состав оконных стилей (WS_*, WS_EX_*) не слишком связаны, при этом функционал системного меню "главнее". Если в случае диалогового окна (Проект Комментария к Win32 API Tutorial by Iczelion (п.18)) круто бузит WS_SYSMENU, то в случае обычного окна нарушитель спокойствия - как раз WS_EX_TOOLWINDOW. Однако благая весть: нежелательные пункты меню можно как задизаблить, так и удалить. Код (Text): WndProc proc uses ebx hWnd:HWND, ... ... .elseif uMsg==WM_CREATE invoke GetSystemMenu,hWnd,FALSE mov ebx,eax ; или так: invoke EnableMenuItem,ebx,SC_MINIMIZE,MF_BYCOMMAND or MF_DISABLED or MF_GRAYED invoke EnableMenuItem,ebx,SC_MAXIMIZE,MF_BYCOMMAND or MF_DISABLED or MF_GRAYED invoke EnableMenuItem,ebx,SC_RESTORE,MF_BYCOMMAND or MF_DISABLED or MF_GRAYED ; или так: ; invoke DeleteMenu,ebx,SC_MINIMIZE,MF_BYCOMMAND ; invoke DeleteMenu,ebx,SC_MAXIMIZE,MF_BYCOMMAND ; invoke DeleteMenu,ebx,SC_RESTORE,MF_BYCOMMAND ; invoke DeleteMenu,ebx,SC_SIZE,MF_BYCOMMAND ; invoke DeleteMenu,ebx,1,MF_BYPOSITION xor eax,eax ... Всего-то изучить справку MSDN по GetSystemMenu, EnableMenuItem, DeleteMenu, WM_SYSCOMMAND...
Attack В Вижуал студии(полной) имеется ml64.exe Наверняка, кто-то уже изготовил "боевой комплект", выдернув ассемблер оттуда. Более того, есть ml64 который можно запускать в win32 !
Ну это добавка к масм - нет ни инклюдов(их нет и в Студии) и много из того, что есть в масм. В самой студии это папка в папке bin - в папке bin 32-битные компиляторы и в папке amd64 - "чисто" 64-битные.