nacerbaaziz Posted April 10, 2020 Posted April 10, 2020 (edited) question about _WinAPI_CreateWindowEx good morning welcome autoit team please i need your help i've searched a lot about how to use the _WinAPI_CreateWindowEx finally i found an example but i found some problem i hope you can help me firstly, i want to set the controls focussable with the keyboard input i already used the ws_tabStop but it did not work with me. secondly, i want to set some access keys linked with the window such as control+o enable the open button and control+f4 exit the app note: i need a local access keys and not a global hotkeys such as GUISetAccelerators finaly, before i will put the code here i must clarify a few things. 1. you will ask me why you don't use the GUICreate function here i'll tell you that it as dialog and It is a little heavy in motion with screen readers. the screen readers for blind has some function that work with dialogs and others work with full windows style 2. you will ask me why you didn't search the net for that? i will tell you that all examples that i found in the internet with pdfs and Picture books. i found some examples in microsoft but it with cpp. ok here is the code i hope you can help me to do what i want thank you in advance expandcollapse popup; Small AutoIt Application that uses Windows API ; Written by Yuraj #NoTrayIcon #include <_RegisterClassEx.au3> #include <WinAPI.au3> #include <WindowsConstants.au3> #include <ButtonConstants.au3> #include <EditConstants.au3> #include <FontConstants.au3> AutoItSetOption("MustDeclareVars", 1) ; Window definitions Const $WinWidth = 370 Const $WinHeight = 350 Const $WinXPos = (@DesktopWidth / 2) - ($WinWidth / 2) Const $WinYPos = (@DesktopHeight / 2) - ($WinHeight / 2) Const $WinTitle = "Win32 Application - Text reader" Const $WinClass = "mainapp" Const $WinIcon = _WinAPI_LoadIcon(_WinAPI_GetModuleHandle("shell32.dll"), 13) ; Windows handles Global $hwnd, $edit1, $btn1, $btn2 ; Fonts Global $fnt1 ; Register class, Create the window Local $retVal = __WinAPI_RegisterClassEx($WinClass, "WindowCallback", $WinIcon, 0, _WinAPI_GetSysColor($COLOR_BTNFACE), BitOR($CS_DEFAULTSTYLE, $CS_DROPSHADOW)) ; If $retVal == 0 Then ; If registerclass fails MsgBox(16, "Error", "Error while registering window class!") Exit EndIf ; Create windows/controls $hwnd = _WinAPI_CreateWindowEx($WS_EX_STATICEDGE, $WinClass, $WinTitle, BitOR($WS_OVERLAPPED,$WS_SYSMENU, $WS_MINIMIZEBOX, $WS_GROUP, $WS_DLGFRAME), $WinXPos, $WinYPos, $WinWidth, $WinHeight, 0) $btn1 = _WinAPI_CreateWindowEx(0, "button", "Open file ...", BitOR($WS_VISIBLE, $WS_CHILD, $WS_TABSTOP, $WS_CLIPCHILDREN), 25, 270, 100, 30,$hwnd) $btn2 = _WinAPI_CreateWindowEx(0, "Button", "Exit", BitOR($WS_VISIBLE, $WS_CHILD, $WS_TABSTOP, $WS_CLIPCHILDREN), 235, 270, 100, 30, $hwnd) $edit1 = _WinAPI_CreateWindowEx(0, "edit", "text", BitOR($WS_VISIBLE, $WS_CHILD, $WS_VSCROLL, $ES_AUTOVSCROLL, $es_readOnly, $WS_TABSTOP), 5, 5, $WinWidth - 15, $WinHeight - 100, $hwnd) ; Set controls identifiers _WinAPI_SetWindowLong($btn1,$GWL_ID,150) _WinAPI_SetWindowLong($btn2,$GWL_ID,160) ; Set (controls) fonts $fnt1 = _CreateFont("MS Sans Serif", 15) _WinAPI_SetFont($btn1, $fnt1) _WinAPI_SetFont($btn2, $fnt1) _WinAPI_SetFont($edit1, $fnt1) ; Set focus to edit _WinAPI_SetFocus($edit1) ; Show window _WinAPI_ShowWindow($hwnd) _WinAPI_UpdateWindow($hwnd) ; Main loop that keep application opened While 1 Sleep(100) WEnd ;=================================================================; ; WINDOW CALLBACK ... ;=================================================================; Func WindowCallback($_hwnd, $iMsg, $wParam, $lParam) Local $iNC, $iID Switch $iMsg ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Case $WM_CLOSE ; Show message on closing If MsgBox(48 + 4, $WinTitle, "Do you want really exit?", 0, $hwnd) <> 6 Then Return 0 ; Call destructor and then exit main thread FinalizeApp() Exit ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Case $WM_COMMAND $iNC = _WinAPI_HiWord($wParam) $iID = _WinAPI_LoWord($lParam) Switch $iNC Case $BN_CLICKED ; When is control clicked Switch _WinAPI_GetDlgCtrlID($iID) Case _WinAPI_GetDlgCtrlID($btn1) BtnOpenFileClick() Case _WinAPI_GetDlgCtrlID($btn2) BtnExitClick() EndSwitch EndSwitch ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; EndSwitch Return _WinAPI_DefWindowProc($_hwnd, $iMsg, $wParam, $lParam) EndFunc ;==>WindowCallback Func FinalizeApp() _WinAPI_DeleteObject($fnt1) _WinAPI_DestroyWindow($hwnd) __WinAPI_UnregisterClass($WinClass) EndFunc ;==>FinalizeApp Func _CreateFont($fontName, $height = 16, $style = $FW_NORMAL, $italic = False, $underline = False, $strikeout = False) Local $hFont = _WinAPI_CreateFont($height, 0, 0, 0, $style, $italic, $underline, $strikeout, $DEFAULT_CHARSET, _ $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, $DEFAULT_PITCH, $fontName) Return $hFont EndFunc ;==>_CreateFont ;=================================================================; ; WINDOW EVENTS ;=================================================================; Func BtnOpenFileClick() Local $ret = _WinAPI_GetOpenFileName("", "Text files (*.txt)|All files (*.*)", ".", "", "", 1, 0, 0, $hwnd) If ($ret[0] > 0) Then Local $path = $ret[1] & "\" & $ret[2] Local $file = _WinAPI_CreateFile($path, 2, 2) Local $buf = DllStructCreate("byte[" & _WinAPI_GetFileSizeEx($file) & "]") Local $i = 0 _WinAPI_ReadFile($file, DllStructGetPtr($buf), _WinAPI_GetFileSizeEx($file), $i) ; Close file handle _WinAPI_CloseHandle($file) _WinAPI_SetWindowText($edit1, BinaryToString(DllStructGetData($buf, 1))) EndIf EndFunc ;==>BtnOpenFileClick Func BtnExitClick() FinalizeApp() Exit EndFunc ;==>BtnExitClick _RegisterClassEx.au3 Edited April 10, 2020 by nacerbaaziz uploaded the _RegisterClassEx.au3
Nine Posted April 12, 2020 Posted April 12, 2020 Unless someone tells me wrong, I do not believe you can do it. It is possible in other languages, but not in AutoIt. You would need to implement a loop with win32 APIs GetMessage, TranslateMessage, DispatchMessage (look MSDN for explaination). Problem is that it will interfere with AutoIt internals and it will not work properly. In the example you found, you are able steel the WindowProc and it will work correctly. That is as far as you can go. But, you could simulate the {TAB} key using _IsPressed or with a hook in the fields that you want to tab in (this later solution may also cause interference as it adds another level of callback). Good luck with it. If you find a solution, please report back here. It would be very nice to see it. ps. I would highly recommend you using AutoIt GUI as I cannot see a true real reason why not. “They did not know it was impossible, so they did it” ― Mark Twain Spoiler Block all input without UAC Save/Retrieve Images to/from Text Monitor Management (VCP commands) Tool to search in text (au3) files Date Range Picker Virtual Desktop Manager Sudoku Game 2020 Overlapped Named Pipe IPC HotString 2.0 - Hot keys with string x64 Bitwise Operations Multi-keyboards HotKeySet Recursive Array Display Fast and simple WCD IPC Multiple Folders Selector Printer Manager GIF Animation (cached) Debug Messages Monitor UDF Screen Scraping Round Corner GUI UDF Multi-Threading Made Easy Interface Object based on Tag
nacerbaaziz Posted April 14, 2020 Author Posted April 14, 2020 On 4/12/2020 at 1:03 PM, Nine said: Unless someone tells me wrong, I do not believe you can do it. It is possible in other languages, but not in AutoIt. You would need to implement a loop with win32 APIs GetMessage, TranslateMessage, DispatchMessage (look MSDN for explaination). Problem is that it will interfere with AutoIt internals and it will not work properly. In the example you found, you are able steel the WindowProc and it will work correctly. That is as far as you can go. But, you could simulate the {TAB} key using _IsPressed or with a hook in the fields that you want to tab in (this later solution may also cause interference as it adds another level of callback). Good luck with it. If you find a solution, please report back here. It would be very nice to see it. ps. I would highly recommend you using AutoIt GUI as I cannot see a true real reason why not. you mean that i must stop searching in autoit and try to use the GUI with an other language? i hope that the autoit team can give us the ability to do that in autoit because it is a buetifull programing language
LarsJ Posted April 16, 2020 Posted April 16, 2020 I'm absolutely sure that Nine is wrong on this one. This can be implemented in AutoIt code. Of course, you cannot use any of the internal functions in the GUI Management section of the help file. But you can use all the UDF code based on Windows API functions in the GUI Reference section. You can generally use all code based on Windows API functions. Read this Microsoft documentation on using accelerator keys and implement CreateAcceleratorTableW as a _WinAPI_ function. If you need advanced functionality that is normally coded through GUIRegisterMsg() then use GUIRegisterMsg20() instead. Controls, File Explorer, ROT objects, UI Automation, Windows Message MonitorCompiled code: Accessing AutoIt variables, DotNet.au3 UDF, Using C# and VB codeShell menus: The Context menu, The Favorites menu. Shell related: Control Panel, System Image ListsGraphics related: Rubik's Cube, OpenGL without external libraries, Navigating in an image, Non-rectangular selectionsListView controls: Colors and fonts, Multi-line header, Multi-line items, Checkboxes and icons, Incremental searchListView controls: Virtual ListViews, Editing cells, Data display functions
Nine Posted April 16, 2020 Posted April 16, 2020 (edited) @LarsJ before making this statement, maybe you should provide a working example of your affirmation. We shall see... Edited April 16, 2020 by Nine “They did not know it was impossible, so they did it” ― Mark Twain Spoiler Block all input without UAC Save/Retrieve Images to/from Text Monitor Management (VCP commands) Tool to search in text (au3) files Date Range Picker Virtual Desktop Manager Sudoku Game 2020 Overlapped Named Pipe IPC HotString 2.0 - Hot keys with string x64 Bitwise Operations Multi-keyboards HotKeySet Recursive Array Display Fast and simple WCD IPC Multiple Folders Selector Printer Manager GIF Animation (cached) Debug Messages Monitor UDF Screen Scraping Round Corner GUI UDF Multi-Threading Made Easy Interface Object based on Tag
LarsJ Posted April 21, 2020 Posted April 21, 2020 Examples here. About the questions in the first post. First of all, I want to state that it is possible to code what you want in AutoIt. However, you should not start with such a low level example as shown in your code box. It's too cumbersome and time consuming. My example 0 is an almost direct copy of the example of _WinAPI_RegisterClassEx() in the help file, which also uses _WinAPI_CreateWindowEx() to create a GUI window. I have placed the code in a function so you can use local variables. Example 1 shows how to code a message loop to handle keyboard accelerators. In example 2, a listview control is created in the window with _GUICtrlListView_Create(). Do not use _WinAPI_CreateWindowEx() to create controls. Use the functions in the GUI Reference section of the help file. Then the Tab key probably works immediately. Example 3 is a more advanced example for implementing subclassing. You probably won't need that. Controls, File Explorer, ROT objects, UI Automation, Windows Message MonitorCompiled code: Accessing AutoIt variables, DotNet.au3 UDF, Using C# and VB codeShell menus: The Context menu, The Favorites menu. Shell related: Control Panel, System Image ListsGraphics related: Rubik's Cube, OpenGL without external libraries, Navigating in an image, Non-rectangular selectionsListView controls: Colors and fonts, Multi-line header, Multi-line items, Checkboxes and icons, Incremental searchListView controls: Virtual ListViews, Editing cells, Data display functions
Nine Posted April 21, 2020 Posted April 21, 2020 Sorry to say but your approach has not solved OP problem. You still cannot provide a script where one could navigate from one control to another with the TAB key. What you have done reflects pretty much the wall I was facing...Thanks for the effort though. “They did not know it was impossible, so they did it” ― Mark Twain Spoiler Block all input without UAC Save/Retrieve Images to/from Text Monitor Management (VCP commands) Tool to search in text (au3) files Date Range Picker Virtual Desktop Manager Sudoku Game 2020 Overlapped Named Pipe IPC HotString 2.0 - Hot keys with string x64 Bitwise Operations Multi-keyboards HotKeySet Recursive Array Display Fast and simple WCD IPC Multiple Folders Selector Printer Manager GIF Animation (cached) Debug Messages Monitor UDF Screen Scraping Round Corner GUI UDF Multi-Threading Made Easy Interface Object based on Tag
LarsJ Posted April 26, 2020 Posted April 26, 2020 According to the documentation for WS_TABSTOP, the IsDialogMessage() function must be included in the message loop to identify a keystroke as a dialog box key. Example here. pixelsearch and Nine 2 Controls, File Explorer, ROT objects, UI Automation, Windows Message MonitorCompiled code: Accessing AutoIt variables, DotNet.au3 UDF, Using C# and VB codeShell menus: The Context menu, The Favorites menu. Shell related: Control Panel, System Image ListsGraphics related: Rubik's Cube, OpenGL without external libraries, Navigating in an image, Non-rectangular selectionsListView controls: Colors and fonts, Multi-line header, Multi-line items, Checkboxes and icons, Incremental searchListView controls: Virtual ListViews, Editing cells, Data display functions
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now