;-Resize v0.1---------------------------------------------------------------- ; x86 - Dos & Win32 - Assembly Language Programming ; ; ; ; Written by: John A Lyons (megablast) ; ; Email : asm@megablast.8k.com ; ; Page : http://asmsource.8k.com/ ; ; Compiler : Masm32 v6.13 Microsoft Macro Assembler ; ; Date : 18-Sep-2001 ; ; Purpose : Simple little program, that establishes a taskbar icon, ; ; and presents a menu that allows you to change the screen ; ; resolution. ; ; ; ; ; ; Thanks to Iczelion and his work in Tutorial 23 on taskbar icons. ; ; http://win32assembly.online.fr/tut23.html ; ; ; ;---------------------------------------------------------------------------- .386 .MODEL FLAT , STDCALL include windows.inc include user32.inc include kernel32.inc include gdi32.inc includelib user32.lib includelib kernel32.lib includelib gdi32.lib include \masm32\include\shell32.inc includelib \masm32\lib\shell32.lib .const IDI_ICON1 equ 5 WM_SHELLNOTIFY equ WM_USER+5 ;------------------------- About aboutdialog DB "ABOUTDIALOG",0 IDC_URL equ 9 IDI_CUR1 equ 101 IDI_BITMAP equ 102 IDC_EXIT equ 3002 ClassName db "SimpleWinClass",0 mhead db "Resize",0 mabout db "About",0 m0 db "640x480 (32 bpp) ",0 m1 db "800x600 (16 bpp) ",0 m2 db "1024x768 (16 bpp) ",0 me db "Exit",0 .data hInstance HINSTANCE ? CommandLine LPSTR ? hwnd HWND ? icon DWORD ? note NOTIFYICONDATA <> hPopupMenu dd ? ;------------------------- About hover BOOL ? ;first BOOL FALSE szOpen db "open",0 hwndDlg dd 0 first2 BOOL FALSE hFinger dd ? orgStatic dd ? buff db 256 dup(?) .code WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:SDWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_BYTEALIGNWINDOW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInstance pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW+1 mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon, hInstance, IDI_ICON1 mov icon,eax mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR mhead,\ WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, 300,100, ;size NULL,NULL,\ hInst,NULL mov hwnd,eax ;INVOKE ShowWindow, hwnd,SW_SHOWNORMAL ;INVOKE UpdateWindow, hwnd .WHILE TRUE INVOKE GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) INVOKE TranslateMessage, ADDR msg INVOKE DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp HyperLinkWndProc PROC uses ebx, hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD LOCAL tmpFont :LOGFONT LOCAL rect:RECT LOCAL pt:POINT LOCAL ps:PAINTSTRUCT mov eax,uMsg .IF eax==WM_NCHITTEST mov eax, 1 ;We want to handle the non client hit test so we return true or 1 ret .ELSEIF eax == WM_CTLCOLORSTATIC push ebx push edx invoke SendMessage, hWnd, WM_GETFONT, 0, 0 mov edx,eax invoke GetObject, edx, sizeof LOGFONT, addr tmpFont mov tmpFont.lfUnderline, TRUE invoke CreateFontIndirect, addr tmpFont mov ebx,eax invoke SelectObject, wParam, ebx .if hover == FALSE invoke SetTextColor, wParam, Blue .else invoke SetTextColor, wParam,Red .endif invoke GetSysColor, COLOR_MENU invoke SetBkColor, wParam, eax invoke DeleteObject,ebx invoke GetStockObject, HOLLOW_BRUSH pop edx pop ebx ret .ELSEIF eax==WM_MOUSEMOVE invoke GetParent,hWnd push ebx mov ebx,eax invoke GetActiveWindow .if eax == ebx invoke GetCursorPos,addr pt invoke GetWindowRect,hWnd,addr rect invoke PtInRect,addr rect,pt.x,pt.y .if eax invoke GetCapture .if !eax invoke SetCapture,hWnd mov hover,TRUE invoke InvalidateRect,hWnd,FALSE,FALSE invoke SetCursor,hFinger .endif .else invoke GetCapture .if eax invoke ReleaseCapture mov hover,FALSE invoke InvalidateRect,hWnd,FALSE,FALSE .endif .endif .endif pop ebx xor eax,eax ret .ELSEIF eax==WM_LBUTTONDOWN invoke GetWindowText,hWnd,offset buff,sizeof buff ;change this for using a preset url invoke ShellExecute, NULL, offset szOpen, offset buff, NULL, NULL, SW_MAXIMIZE ;change this to represent your preset url mov hover,FALSE invoke InvalidateRect,hWnd,FALSE,FALSE invoke SendMessage, hWnd, WM_GETFONT, 0, 0 ;Get the defualt system font mov edx,eax ;store result invoke GetObject, edx, sizeof LOGFONT, addr tmpFont ;get our font into a logfont structure mov tmpFont.lfUnderline, TRUE ;under line the link invoke CreateFontIndirect, addr tmpFont ;Create the new font mov ebx,eax ;We need the return to free the memory later invoke SelectObject, wParam, ebx ;Select our control invoke SetTextColor, wParam, Blue ;change this to change the color of the link xor eax,eax ret .ENDIF invoke CallWindowProc, orgStatic, hWnd, uMsg, wParam, lParam ret HyperLinkWndProc endp AboutDlgProc PROC hWnd:HWND,iMsg:DWORD,wParam:WPARAM, lParam:LPARAM LOCAL hdc:DWORD LOCAL ps:PAINTSTRUCT LOCAL rect:RECT mov eax,iMsg .if eax==WM_INITDIALOG invoke GetDlgItem, hWnd, IDC_URL invoke SetWindowLong, eax, GWL_WNDPROC, ADDR HyperLinkWndProc mov orgStatic,eax invoke LoadCursor,hInstance,IDI_CUR1 mov hFinger,eax ; push count ; push offset runcount1 ; push offset buff ; call wsprintfA ; add esp,0ch ; invoke SendDlgItemMessage, hWnd, IDD_LOAD, WM_SETTEXT, 0,ADDR buff xor eax,eax ret .ELSEIF eax == WM_CTLCOLORSTATIC invoke SendMessage,lParam,iMsg,wParam,lParam ret .elseif eax==WM_CLOSE invoke EndDialog,hWnd,NULL mov hwndDlg,0 .elseif eax==WM_COMMAND push edx mov eax,wParam mov edx,eax shr edx,16 .if eax==IDC_EXIT invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL invoke EndDialog,hWnd,NULL mov hwndDlg,0 .endif pop edx .else mov eax,FALSE ret .endif mov eax,TRUE ret AboutDlgProc endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL hdc:HDC LOCAL ps:PAINTSTRUCT LOCAL dm:DEVMODE LOCAL pt:POINT mov eax,uMsg .IF eax==WM_DESTROY invoke Shell_NotifyIcon,NIM_DELETE,addr note invoke PostQuitMessage,NULL .ELSEIF eax==WM_CREATE invoke CreatePopupMenu mov hPopupMenu,eax invoke AppendMenu,hPopupMenu,MF_STRING,0,addr mhead invoke AppendMenu,hPopupMenu,MF_STRING,4,addr mabout invoke AppendMenu,hPopupMenu,MF_SEPARATOR,0,0 invoke AppendMenu,hPopupMenu,MF_STRING,3,addr m0 invoke AppendMenu,hPopupMenu,MF_STRING,1,addr m1 invoke AppendMenu,hPopupMenu,MF_STRING,2,addr m2 invoke AppendMenu,hPopupMenu,MF_SEPARATOR,0,0 invoke AppendMenu,hPopupMenu,MF_STRING,99,addr me mov note.cbSize,sizeof NOTIFYICONDATA push hWnd pop note.hwnd mov note.uID,1;IDI_TRAY mov note.uFlags,7;NIF_ICON+NIF_MESSAGE+NIF_TIP mov note.uCallbackMessage,WM_SHELLNOTIFY invoke LoadIcon,NULL,IDI_ICON1;IDI_APPLICATION;IDI_WINLOGO mov eax,icon mov note.hIcon,eax invoke lstrcpy,addr note.szTip,addr ClassName invoke Shell_NotifyIcon,NIM_ADD,addr note mov dm.dmSize,SIZEOF DEVMODE mov dm.dmBitsPerPel,16 ;Bits per pixel mov dm.dmPelsWidth,1024;800 ;Pixel width mov dm.dmPelsHeight,768;600 ;Pixel height ;mov dm.dmDisplayFlags, ;Mode flags ;mov dm.dmDisplayFrequency ;Mode frequency ;mov dm.dmFields,DM_BITSPERPEL + DM_PELSWIDTH + DM_PELSHEIGHT mov dm.dmFields,40000h+80000h+100000h ;invoke ChangeDisplaySettings,ADDR dm,1;CDS_UPDATEREGISTRY .elseif eax==WM_SHELLNOTIFY .if wParam==1;IDI_TRAY mov eax,lParam ;invoke GetCursorPos,addr pt ;invoke TrackPopupMenu,hPopupMenu,TPM_RIGHTALIGN,pt.x,pt.y,NULL,hWnd,NULL .if ax==WM_RBUTTONDOWN invoke GetCursorPos,addr pt invoke TrackPopupMenu,hPopupMenu,TPM_RIGHTALIGN,pt.x,pt.y,NULL,hWnd,NULL .endif .endif .elseif uMsg==WM_COMMAND .if lParam==0 mov eax,wParam .if ax==3 mov dm.dmSize,SIZEOF DEVMODE mov dm.dmBitsPerPel,32 ;Bits per pixel mov dm.dmPelsWidth,640;800 ;Pixel width mov dm.dmPelsHeight,480;600 ;Pixel height mov dm.dmFields,40000h+80000h+100000h invoke ChangeDisplaySettings,ADDR dm,1;CDS_UPDATEREGISTRY .elseif ax==2 mov dm.dmSize,SIZEOF DEVMODE mov dm.dmBitsPerPel,16 ;Bits per pixel mov dm.dmPelsWidth,1024;800 ;Pixel width mov dm.dmPelsHeight,768;600 ;Pixel height mov dm.dmFields,40000h+80000h+100000h invoke ChangeDisplaySettings,ADDR dm,1;CDS_UPDATEREGISTRY .elseif ax==1 mov dm.dmSize,SIZEOF DEVMODE mov dm.dmBitsPerPel,16 ;Bits per pixel mov dm.dmPelsWidth,640;800 ;Pixel width mov dm.dmPelsHeight,480;600 ;Pixel height mov dm.dmFields,40000h+80000h+100000h invoke ChangeDisplaySettings,ADDR dm,1;CDS_UPDATEREGISTRY .elseif ax==99 invoke DestroyWindow,hWnd .elseif ax==4 lea eax,AboutDlgProc invoke CreateDialogParam,hInstance,addr aboutdialog,hWnd,eax,NULL mov hwndDlg,eax .endif .endif .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT invoke ExitProcess,eax end start