WH_JOURNALRECORD钩子的有关问题

WH_JOURNALRECORD钩子的问题
看到老罗的win32的第11章日志记录钩子实现键盘钩子,后来我根据这个改了一下,做了一个实验,在钩子回调函数中判断如果按键是F1,就弹出一个对话框....
可是摁了F1以后会弹出一堆对话框,而且对话框很奇怪的在屏幕右下角出现,请问大牛们这是怎么回事?
Assembly code

        .386
        .model flat, stdcall
        option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include        windows.inc
include        user32.inc
includelib    user32.lib
include        kernel32.inc
includelib    kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN    equ    1000
DLG_MAIN    equ    1000
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data?

hInstance    dd    ?
hWinMain    dd    ?
hHook        dd    ?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data
        
szTest        db    'Test', 0


        .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 钩子回调函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
HookProc    proc    _dwCode,_wParam,_lParam
        local    @szKeyState[256]:byte

        invoke    CallNextHookEx,hHook,_dwCode,_wParam,_lParam
        pushad
        .if    _dwCode == HC_ACTION
            mov    ebx,_lParam
            assume    ebx:ptr EVENTMSG
            .if    [ebx].message == WM_KEYDOWN
                mov    ecx, [ebx].paramL
                and    ecx, 0ffh
                .if    ecx == VK_F1
                    invoke    MessageBox, hWinMain, addr szTest, \
                        addr szTest, MB_OK
                .endif
            .endif
            assume    ebx:nothing
        .endif
        popad
        xor    eax,eax
        ret

HookProc    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain    proc    uses ebx edi esi hWnd,wMsg,wParam,lParam

        mov    eax,wMsg
;********************************************************************
        .if    eax ==    WM_CLOSE
            invoke    UnhookWindowsHookEx,hHook
            invoke    EndDialog,hWnd,NULL
;********************************************************************
        .elseif    eax ==    WM_INITDIALOG
            push    hWnd
            pop    hWinMain
            invoke    SetWindowsHookEx,WH_JOURNALRECORD,addr HookProc,hInstance,NULL
            .if    eax
                mov    hHook,eax
            .else
                invoke    EndDialog,hWnd,NULL
            .endif
;********************************************************************
        .else
            mov    eax,FALSE
            ret
        .endif
        mov    eax,TRUE
        ret

_ProcDlgMain    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
        invoke    GetModuleHandle,NULL
        mov    hInstance,eax
        invoke    DialogBoxParam,eax,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
        invoke    ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        end    start