GetWindowInfo

From NSIS Wiki
Jump to navigationJump to search
Author: Zinthose (talk, contrib)


Description

Quick and dirty example of how to use System plug-in to call GetWindowInfo.

Warning: before September 2019, this example contained a buffer overrun error that could cause crashes. sizeof(WINDOWINFO) is 60, not 56.

GetWindowInfo Example.nsi

OutFile "GetWindowInfo Example.exe"
ShowInstDetails show 
!include WinMessages.nsh
 
Section Main1
    System::Alloc 60
    Pop $0
    System::Call "*$0(i 60)"
    System::Call "User32::GetWindowInfo(i $HWNDPARENT,i r0) i .r1"
 
    DetailPrint "RC=$1"
 
    ## rcWindow
        IntOp $R0 $0 + 4
        System::Call "*$R0(i .r1,i .r2,i .r3,i .r4)"
 
        DetailPrint "rcWindow.left=$1"
        DetailPrint "rcWindow.top=$2"
        DetailPrint "rcWindow.right=$3"
        DetailPrint "rcWindow.bottom=$4"
 
    ## rcClient
        IntOp $R0 $0 + 20
        System::Call "*$R0(i .r1,i .r2,i .r3,i .r4)"
 
        DetailPrint "rcClient.left=$1"
        DetailPrint "rcClient.top=$2"
        DetailPrint "rcClient.right=$3"
        DetailPrint "rcClient.bottom=$4"
 
    ## dwStyle
        IntOp $R0 $0 + 36
        System::Call "*$R0(i .r1)"
        intfmt $1 "0x%08X" $1
 
        DetailPrint "dwStyle=$1"
 
    ## dwExStyle
        IntOp $R0 $0 + 40
        System::Call "*$R0(i .r1)"
        intfmt $1 "0x%08X" $1
 
        DetailPrint "dwExStyle=$1"
 
    ## dwWindowStatus
        IntOp $R0 $0 + 44
        System::Call "*$R0(i .r1)"
        intfmt $1 "0x%08X" $1
 
        DetailPrint "dwWindowStatus=$1"
 
    ## cxWindowBorders
        IntOp $R0 $0 + 48
        System::Call "*$R0(i .r1)"
        intfmt $1 "%u" $1
 
        DetailPrint "cxWindowBorders=$1"         
 
    ## cyWindowBorders
        IntOp $R0 $0 + 52
        System::Call "*$R0(i .r1)"
        intfmt $1 "%u" $1
 
        DetailPrint "cyWindowBorders=$1"   
 
        System::Free $0
 
SectionEnd