News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

FlashWindowEx

Started by MichaelW, February 06, 2006, 11:11:36 AM

Previous topic - Next topic

MichaelW

jdoe posted some information on FlashWindowEx here:

http://www.masmforum.com/simple/index.php?topic=3374.msg28700#msg28700

So decided to try it out. When I originally noticed the function I assumed it would be for XP and later only, but it's supported all the way back to Windows 98.

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    include \masm32\include\masm32rt.inc

    DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD

    FLASHW_ALL        equ 3
    FLASHW_CAPTION    equ 1
    FLASHW_STOP       equ 0
    FLASHW_TIMER      equ 4
    FLASHW_TIMERNOFG  equ 12
    FLASHW_TRAY       equ 2

    FLASHWINFO STRUCT
      cbSize     DWORD ?
      hwnd       DWORD ?
      dwFlags    DWORD ?
      uCount     DWORD ?
      dwTimeout  DWORD ?
    FLASHWINFO ENDS

    .data       
        hInstance dd 0
        fw        FLASHWINFO <>
    .code
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
start:
      mov hInstance, rv(GetModuleHandle,NULL)
      call Main
      invoke ExitProcess, eax
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
Main proc
    Dialog "FLASHER","MS Sans Serif",8,WS_OVERLAPPED or WS_SYSMENU, \
            1,5,5,60,50,1024
    DlgButton "Go",WS_TABSTOP,18,15,30,10,1000
    CallModalDialog hInstance,0,DlgProc,NULL
    ret
Main endp
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
DlgProc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
    .IF uMsg == WM_INITDIALOG
    .ELSEIF uMsg == WM_COMMAND
      .IF wParam == 1000
        mov   fw.cbSize, SIZEOF(FLASHWINFO)
        m2m   fw.hwnd, hWin
        mov   fw.dwFlags, FLASHW_ALL
        mov   fw.uCount, 40
        mov   fw.dwTimeout, 40
        invoke FlashWindowEx, ADDR fw
      .ENDIF
    .ELSEIF uMsg == WM_CLOSE
       invoke EndDialog, hWin, 0
    .ENDIF
    return 0
DlgProc endp
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
end start

eschew obfuscation

jdoe


And with these little modifications, you can reproduce the same Windows XP behavior...


;
; hWnd             : Handle of the window to be flashed
; dwRepeatCount    : 0 = flashing continuously until the window comes to the foreground
;                  : > 0 = stop flashing after count is reached but color stays on
;
; Return value (eax) is nonzero if the window caption was drawn as active before the call
;
FlashingWindow proc hWnd:dword, dwRepeatCount:dword

   local fwi:FLASHWINFO

   mov fwi.cbSize, sizeof FLASHWINFO
   mov eax, hWnd
   mov fwi.hwnd, eax
   mov fwi.dwFlags, FLASHW_TIMERNOFG or FLASHW_ALL
   mov eax, dwRepeatCount
   mov fwi.uCount, eax
   mov fwi.dwTimeout, 500

   invoke FlashWindowEx, addr fwi

   ret

FlashingWindow endp


:wink