Opened 3 years ago

Last modified 3 years ago

#3809 closed Bug

WinGetTitle returns blank on Windows 10 using _WinAPI_CreateWindowEx — at Version 1

Reported by: Nine Owned by:
Milestone: 3.3.15.4 Component: AutoIt
Version: 3.3.14.5 Severity: None
Keywords: Cc:

Description (last modified by mLipok)

It is working fine under Win7. But with Win10, WinGetTitle returns blank when called with $hWnd while using _WinAPI_CreateWindowEx. If you replace $hWnd with actual title, it works. If you use "[CLASS:MyWindowClass]", it works. If you do a WinList(), it will appear in the list.

#include <WinAPIRes.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>

Opt( "MustDeclareVars", 1 )

Global $bExit = False

Example()

Func Example()
        Local Const $sClass = "MyWindowClass"
        Local Const $sName = "_WinAPI_RegisterClassEx"

        ; Get module handle for the current process
        Local $hInstance = _WinAPI_GetModuleHandle( 0 )

        ; Create a class cursor
        Local $hCursor = _WinAPI_LoadCursor( 0, 32512 ) ; IDC_ARROW

        ; Create a class icons (large and small)
        Local $tIcons = DllStructCreate( "ptr;ptr" )
        _WinAPI_ExtractIconEx( @SystemDir & "\shell32.dll", 130, DllStructGetPtr( $tIcons, 1 ), DllStructGetPtr( $tIcons, 2 ), 1 )
        Local $hIcon = DllStructGetData( $tIcons, 1 )
        Local $hIconSm = DllStructGetData( $tIcons, 2 )

        ; Create DLL callback function (window procedure)
        Local $pWinProc = DllCallbackGetPtr( DllCallbackRegister( "WinProc", "lresult", "hwnd;uint;wparam;lparam" ) )

        ; Create and fill $tagWNDCLASSEX structure
        Local $tWCEX = DllStructCreate( $tagWNDCLASSEX & ";wchar szClassName[" & ( StringLen( $sClass ) + 1 ) & "]" )
        DllStructSetData( $tWCEX, "Size", DllStructGetPtr( $tWCEX, "szClassName" ) - DllStructGetPtr( $tWCEX ) )
        DllStructSetData( $tWCEX, "Style", 0 )
        DllStructSetData( $tWCEX, "hWndProc", $pWinProc )
        DllStructSetData( $tWCEX, "ClsExtra", 0 )
        DllStructSetData( $tWCEX, "WndExtra", 0 )
        DllStructSetData( $tWCEX, "hInstance", $hInstance )
        DllStructSetData( $tWCEX, "hIcon", $hIcon )
        DllStructSetData( $tWCEX, "hCursor", $hCursor )
        DllStructSetData( $tWCEX, "hBackground", _WinAPI_CreateSolidBrush( _WinAPI_GetSysColor( $COLOR_3DFACE ) ) )
        DllStructSetData( $tWCEX, "MenuName", 0 )
        DllStructSetData( $tWCEX, "ClassName", DllStructGetPtr( $tWCEX, "szClassName" ) )
        DllStructSetData( $tWCEX, "hIconSm", $hIconSm )
        DllStructSetData( $tWCEX, "szClassName", $sClass )

        ; Register a window class
        _WinAPI_RegisterClassEx( $tWCEX )

        ; Create a window
        Local $hWnd = _WinAPI_CreateWindowEx( 0, $sClass, $sName, BitOR( $WS_CAPTION, $WS_POPUPWINDOW, $WS_VISIBLE ), ( @DesktopWidth - 826 ) / 2, ( @DesktopHeight - 584 ) / 2, 826, 584, 0 )
  MsgBox ($MB_SYSTEMMODAL, "", WinGetTitle($hWnd))

  ; Main msg loop
        While Sleep(10)
                If $bExit Then ExitLoop
        WEnd

        ; Unregister window class and release resources
        _WinAPI_UnregisterClass( $sClass, $hInstance )
        _WinAPI_DestroyCursor( $hCursor )
        _WinAPI_DestroyIcon( $hIcon )
        _WinAPI_DestroyIcon( $hIconSm )
EndFunc

; Window procedure
Func WinProc( $hWnd, $iMsg, $wParam, $lParam )
        Switch $iMsg
                Case $WM_CLOSE
                        $bExit = True
        EndSwitch
        Return _WinAPI_DefWindowProcW( $hWnd, $iMsg, $wParam, $lParam )
EndFunc

Change History (1)

comment:1 Changed 3 years ago by mLipok

  • Description modified (diff)
Note: See TracTickets for help on using tickets.