Jump to content

Search the Community

Showing results for tags 'GuiRegisterMsg'.

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • General
    • Announcements and Site News
    • Administration
  • AutoIt v3
    • AutoIt Help and Support
    • AutoIt Technical Discussion
    • AutoIt Example Scripts
  • Scripting and Development
    • Developer General Discussion
    • Language Specific Discussion
  • IT Administration
    • Operating System Deployment
    • Windows Client
    • Windows Server
    • Office

Categories

  • AutoIt Team
    • Beta
    • MVP
  • AutoIt
    • Automation
    • Databases and web connections
    • Data compression
    • Encryption and hash
    • Games
    • GUI Additions
    • Hardware
    • Information gathering
    • Internet protocol suite
    • Maths
    • Media
    • PDF
    • Security
    • Social Media and other Website API
    • Windows
  • Scripting and Development
  • IT Administration
    • Operating System Deployment
    • Windows Client
    • Windows Server
    • Office

Categories

  • Forum FAQ
  • AutoIt

Calendars

  • Community Calendar

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Member Title


Location


WWW


Interests

Found 15 results

  1. Function Reference _GUIRegisterMsgEx.au3 Register a user defined function for a known Windows Message ID (WM_MSG) to an individual ctrl using Call Back! Sintax: _GUICtrlMsg_Register( controlID, MsgID, "Function" ) _GUICtrlMsg_UnRegister( hWnd [, MsgID ]) Supports: ; AutoIt GUI controls to register message! Downloads: Version: 0.9b _GUIRegisterMsgEx_(RedirectLink).html Note: The functions have new parameters!, see fixes below! You can use this UDF in controls that consume internally specific Windows Message ID that we could not register with the GUIRegisterMsg function, eg: WM_CHAR, WM_KEYDOWN, WM_KEYUP are consumed by an edit control. Usage example is included! Sample: Fixes: I.e: Func _MyRegisterFunc( $hCtrlID, $iMsgID, $WParam, $LParam ) ;... EndFunc The 4 parameters have the following values: hCtrlID, The control handle in which the message is registered.iMsg, The Windows message ID.wParam, The first message parameter as hex value.lParam, The second message parameter as hex value. (Position. Parameter, Meaning) 0.9.0812.2600b09/09/2012 -> First release!I like to use UDFs, although I think this will not be very useful, I hope someone will find useful! Regards, João Carlos.
  2. #AutoIt3Wrapper_AU3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7 #include "GuiChildTabUDF.au3" Global $__iFlashWindowEx = 0 ; ..see _WM_SETCURSOR() tabGUI_OPTs("RandomColor", 1) ; ..to add coloring to the GUIs, for debug. ( Default is 0 ) tabGUI_OPTs("SetCtrlDbgCreateWidth", 1) ; tells the UDF to leave some space for the debug buttons ( see tabGUI_CtrlDbgCreate() ). ( Default is 0 ) tabGUI_Example() Func tabGUI_Example() ; tabGUI_Create() has the same parameters as GUICreate() ; ..just skip the styles, as those are handled by the function. tabGUI_Create("Parent/Children Example") ; the first GUI will have to be the parent tabGUI_CtrlDbgCreate("Show GUI array") ; All these are tabGUI_CtrlDbgCreate("Show OPT array") ; for debug and tabGUI_CtrlDbgCreate("Swap GUIs/LABELs") ; are not needed tabGUI_CtrlDbgCreate("Can Drag child") ; to use the UDF tabGUI_CtrlDbgCreate("Self CPU usage") ; These are called after a GUI is present. ; search for "SetResizing:" to understand the TITLE modification ( used for tabGUI_DockStr2Int() ) tabGUI_Create("SetResizing:LBWH;1", 400, 400, 20, 20) ; all other GUI will be child addSomeControls() tabGUI_Create("2", 400, 400, 60, 60) addSomeControls() ; multiple child in child example ; ..skip the width and heigth, to have the function calculate the values. tabGUI_Create("3", Default, Default, 200, 230) tabGUI_Create("4", Default, Default, 20, 20, Default, Default, $__a_tabGUI[@extended][$eGui_HWindowSelf]) tabGUI_Create("5", Default, Default, 20, 20, Default, Default, $__a_tabGUI[@extended][$eGui_HWindowSelf]) Local $hGUI = tabGUI_Create("6", Default, Default, 20, 20, Default, Default, $__a_tabGUI[@extended][$eGui_HWindowSelf]) ; ..the function returns the windows handle, just like GUICreate() would. ConsoleWrite('$hGUI = ' & $hGUI & ' - @extended: ' & @extended & ' ( @extended returns the GUI index in the array )' & @CRLF) addSomeControls() GUISetState(@SW_SHOW, $__a_tabGUI[1][$eGui_HWindowSelf]) ; Time to show the parent GUI GUISwitch($__a_tabGUI[1][$eGui_HWindowSelf]) ; and get focus. GUIRegisterMsg($WM_SETCURSOR, "_WM_SETCURSOR") ; for _WinAPI_FlashWindowEx() While 1 Sleep(1000000) ; ..no need to sleep() a minimum in this loop, as is just there to not close the script in this example. WEnd EndFunc ;==>tabGUI_Example Func addSomeControls() ; ..some controls to add to the example GUICtrlCreateButton("bttn 1", 10, 10, 55, 25) GUICtrlSetOnEvent(-1, "addSomeEvents") GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT) GUICtrlCreateButton("bttn 2", 10, 35, 55, 25) GUICtrlSetOnEvent(-1, "addSomeEvents") GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT) GUICtrlCreateTab(10, 70, 380, 320) GUICtrlSetOnEvent(-1, "addSomeEvents") GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKTOP + $GUI_DOCKLEFT + $GUI_DOCKBOTTOM) GUICtrlCreateTabItem("TabSheet1") GUICtrlCreateTabItem("TabSheet2") GUICtrlCreateTabItem("") EndFunc ;==>addSomeControls Func addSomeEvents() ;~ $__iFlashWindowEx = TimerInit() MsgBox(0, "your ""OnEvent""", "@GUI_CtrlId = " & @GUI_CtrlId, 1, $__a_tabGUI[1][$eGui_HWindowSelf]) ;~ $__iFlashWindowEx = 0 EndFunc ;==>addSomeEvents Func _WM_SETCURSOR($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam ; FYI: this is meant to flash the Parent GUI of a MsgBox(), ; so the MsgBox() needs a Parent GUI declaration. ; If the 0xFFFE guess don't work, or just wanna save CPU cycles, then you'll need a trigger. ; Maybe something like this below. ;~ If $__iFlashWindowEx = 0 Then Return $GUI_RUNDEFMSG ;~ If TimerDiff($__iFlashWindowEx) < 100 Then Return $GUI_RUNDEFMSG Local Static $hTimerTooSoon = TimerInit(), $hTimerWaitAMoment = TimerInit() If _WinAPI_LoWord($lParam) <> 0xFFFE Then $hTimerWaitAMoment = TimerInit() Return $GUI_RUNDEFMSG EndIf If TimerDiff($hTimerWaitAMoment) < 200 Then Return $GUI_RUNDEFMSG If TimerDiff($hTimerTooSoon) < 500 Then Return $GUI_RUNDEFMSG Local $mouse = _WinAPI_HiWord($lParam) ; https://docs.microsoft.com/en-us/windows/win32/menurc/wm-setcursor ; https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-mousemove Local Const $MK_LBUTTON = 0x0001 Local Const $MK_RBUTTON = 0x0002 Local Const $MK_MBUTTON = 0x0010 Local Const $MK_XBUTTON1 = 0x0020 Local Const $MK_XBUTTON2 = 0x0040 ;~ If BitAND($mouse, $MK_LBUTTON) Then ConsoleWrite('- clicked MK_LBUTTON' & @CRLF) ;~ If BitAND($mouse, $MK_RBUTTON) Then ConsoleWrite('- clicked MK_RBUTTON' & @CRLF) ;~ If BitAND($mouse, $MK_MBUTTON) Then ConsoleWrite('- clicked MK_MBUTTON' & @CRLF) ;~ If BitAND($mouse, $MK_XBUTTON1) Then ConsoleWrite('- clicked MK_XBUTTON1' & @CRLF) ;~ If BitAND($mouse, $MK_XBUTTON2) Then ConsoleWrite('- clicked MK_XBUTTON2' & @CRLF) If BitAND($mouse, $MK_LBUTTON) Or BitAND($mouse, $MK_RBUTTON) Or _ BitAND($mouse, $MK_MBUTTON) Or BitAND($mouse, $MK_XBUTTON1) Or _ BitAND($mouse, $MK_XBUTTON2) Then $hTimerTooSoon = TimerInit() _WinAPI_MessageBeep(4) ; mimic what windows does by default when _WinAPI_FlashWindowEx($hWnd, 3, 6, 50) ; clicking the title. _WinAPI_FlashWindowEx(WinGetHandle("[CLASS:#32770;]"), 3, 6, 50) ; ..this works on the MsgBox() because is the "on top" in the Z order ; as the code just created it ( and it *is* on top ). EndIf Return $GUI_RUNDEFMSG EndFunc ;==>_WM_SETCURSOR This is a post of example(s). The code started due to the observation that controls don't look the same when in a tab control. Digging thru the forum I found chunks of code so I smash them together to solve my issues. The "UDF" is more of an useful include than an UDF, but it shows how to use Child GUIs instead of a TAB control. In each child GUI you can have a GUICtrlCreateTab(). ( something that I did not realize until I browse the Wiki ) Working on the code I found myself having to GUIRegisterMsg(). Then why not register more and do more. Took me about a month to discover how to put it together. Then I'm like "this would make a good example". So try it out, use what you need ( or as is ). Hopefully it'll save you the learning curve. The code is in the downloads section. ( I'm a copy and paste kind of coder, so racking my brain is not my forte. But at times, is what it takes to get working code ) PS: if you find a better way to do something or a gross misinterpretation in the code, do share. ( so I can copy and paste )
  3. NEW VERSION: 17 Jun 2013 Ever wondered how to avoid input being so painful? You can type a lot of errors in a GUICtrlCreateInput, for example alphanumeric where you want only numbers and decimals, typing 10 characters where you only want 9, etc. Input masks can make your life easier and Validation can be as simple as this: GuiCtrlCreateLabel("Input Decimal(8,2)", 10, 110, 200, 15) $MyInput = GUICtrlCreateInput("",210,110,110,20) _Inputmask_add($MyInput, $iIM_INTEGER, 0, "", 8, 2) It requires only one additional line per input The UDFexample script demonstrates 13 dynamic input validations. A lot more validations can be made. Up to you to be inventive. _inputmask 1.0.0.5.zip Enhanced: Better input control - The previous versions worked well with blank fields but editing non-blank inputs was really a pain. Now the cursor remains where the edit is occurring. Once the max width is reached, no additional characters can be added. - Added beep on invalid entry. In fact I use soundplay instead of beep because beep gives a cracking sound result on my laptop. You can set beep off (put Global $bBeep = False anywhere in your script) If you prefer a true beep, you can beep it on in line 150. Minor issue: - decimal Numbers after the '.' scroll away when inserting until it bumps to the max allowed decimals. I didn't fix that yet, I don't know how to solve this ... Examples: Example 1 _inputmask - example.au3 (see zip file) Example 2: _Inputmask combining two WM_COMMAND handlers (see zip file) Thanks to Melba23 for his explanation how to combine GUIRegisterMsg WM_COMMAND handlers) If you create your own input mask that could be useful for the AutoIt community, please let me know, I will be glad to add it to the above example. GreenCan
  4. I have read the Tutorial. Used the Help File and used an example script by @Melba23. I am still struggling. To use GUIRegisterMsg one needs the following a control in the GUI a GUIRegisterMsg instruction in the GUI to link the control to the WM_COMMAND function a Case statement in the Switch loop to run it a WM_COMMAND function and a processor function... Mine looks like this ;~ ; QuickSearch combo box $g_cbQwkSrch = GUICtrlCreateCombo("", 8, 26, 180, 17) ; start blank GUICtrlSetTip($g_cbQwkSrch, "Type to search", "QuickSearch") GUIRegisterMsg($WM_COMMAND, "__WM_COMMAND_QWKSEARCH_CMB") ;------------------------------------ ; use in Switch Loop ;~ ; QuickSearch Case $g_cbQwkSrch ConsoleWrite("221 Case $g_cbQwkSrch" & @CRLF) ;-------------------------------------- Func _QwkSrch_Edit_Changed() ConsoleWrite("41 _QwkSrch_Edit_Changed" & @CRLF) ; Autocomplete the edit _GUICtrlComboBox_AutoComplete($g_cbQwkSrch) ; Change the label to match the autocompleted edit entry EndFunc ;==>_QwkSrch_Edit_Changed Func __WM_COMMAND_QWKSEARCH_CMB($hWnd, $iMsg, $wParam, $lParam) ; GUIRegisterMsg($WM_COMMAND, "__WM_COMMAND_QWKSEARCH_CMB") ConsoleWrite("50 _WM_COMMAND_QWKSEARCH_CMB fired " & @CRLF) Local $Found = '' #forceref $hWnd, $iMsg If $lParam = GUICtrlGetHandle($g_cbQwkSrch) And BitShift($wParam, 16) = $CBN_EDITCHANGE Then ; Our combo edit content has changed ; get data from source ---------------------------- Local $datafromsource = fFindFilesForQuickSearch($stringtofind) ; datafromsource convert to Combo friendly format ; Add data to combo _GUICtrlComboBox_BeginUpdate($g_cbQwkSrch) GUICtrlSetData($g_cbQwkSrch, $Found) _GUICtrlComboBox_EndUpdate($g_cbQwkSrch) EndIf _QwkSrch_Edit_Changed() ; Action this function EndIf EndFunc ;==>_WM_COMMAND_QWKSEARCH_CMB Func fFindFilesForQuickSearch($stringtofind) ; helper function for QuickSearch ; get data here Return $aResult EndFunc ;==>fFindFilesForQuickSearch Now the following: Can I declare the variable $g_cbQwkSrch in Global, then use in multiple functions - reassigning different combo's to it as I go along? Should GUIRegisterMsg be expressly de-registered, or does that happen automatically at GuiDelete()? Where is the best/correct place to call GUIRegisterMsg? With the creation of its control, before the GUISetState, or before the start of the loop? The Help File contains this entry, what is the intent? Must this always be called with four args, or a max of four... !!! To make the user function workable you have to define it with maximum 4 function parameters otherwise the function won't be called !!!
  5. Hi Best example I could find is here ::/html/libfunctions/_GUICtrlTreeView_ClickItem.htm The way I understand this, the standard Windows messages, such as Left/Right Click etc are covered by AutoIt macros, but the real power is locked up inside this WM_NOTIFY . I have tried, but I am not even sure I understand what I am looking at. I need help understanding this. What I am looking for is Help file or Tutorial explaining how this works? Perhaps if there is a script showing both the working of an AutoIt macro and the WM_NOTIFY in action, it would help. Right now I am so lost, I do not even know what are the right questions to ask. One issue I have is on ListViews, how to combine the "Click" of a line with a standard Switch loop? Like users clicks a line, then get the loop to detect the click and ;do something ... Any ideas? Skysnake
  6. Hi all, I know this is a crazy idea. But i think it might be a help for somebody. The name of this program is GRM Helper. i.e. GUIRegisterMsg Helper. This program helps you to write the guiregistermsg function code automatically. You can choose a control from the combo box. Then all events of that control will be displayed in a list view. You can click on an event for it;s details. Then you can check the events which you want to include in your code. Then type some details like; 1) Your control's handle. 2) Line number for inserting GUIRegisterMsg code. 3) Line number for inserting main function. And press the "Isert To SciTE" button. Your code is ready in scite. Here is the program. Updated Version 1.1 GRM Helper V1.1.zip The code written by this program. GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg Local $hWndFrom, $iIDFrom, $iCode, $hWndListBox If Not IsHWnd($Sample) Then $hWndListBox = GUICtrlGetHandle($Sample) $hWndFrom = $lParam $iIDFrom = BitAND($wParam, 0xFFFF) ; Low Word $iCode = BitShift($wParam, 16) ; Hi Word Switch $hWndFrom Case $Sample, $hWndListBox Switch $iCode Case $LBN_ERRSPACE ; Insert your code here Case $LBN_SELCHANGE ; Insert your code here Case $LBN_DBLCLK ; Insert your code here Case $LBN_SELCANCEL ; Insert your code here EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_COMMAND
  7. Hi all, I am playing with a combo box. The code from help file is working. But the code i wrote is not working. Help file uses "_GUICtrlComboBox_Create" for creating combo box. But i used native "GUICtrlCreateCombo". Then i replaced my native combo creation function with the UDF. Then my code worked. I think the hi word and low word parameters are the problem. Here is my code. #include <ComboConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> Local $sCMB_Items = "Apple|Orange|Mango|Banana|Grape" #Region ### START Koda GUI section ### Form= Global $hForm1 = GUICreate("Form1", 283, 188, 312, 166) Global $hCombo1 = GUICtrlCreateCombo("", 40, 48, 185, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL)) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### GUICtrlSetData($hCombo1, $sCMB_Items) GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg Local $hWndFrom, $iIDFrom, $iCode $hWndFrom = $lParam $iIDFrom = BitAND($wParam, 0xFFFF) ; Low Word $iCode = BitShift($wParam, 16) ; Hi Word Switch $hWndFrom Case $hCombo1 Switch $iCode Case $CBN_DBLCLK ; Insert your code here MsgBox(0,"","$CBN_DBLCLK") Case $CBN_DROPDOWN ; Insert your code here MsgBox(0,"","$CBN_DROPDOWN") Case $CBN_EDITCHANGE ; Insert your code here MsgBox(0,"","$CBN_EDITCHANGE") Case $CBN_SELCHANGE ; Insert your code here MsgBox(0,"","$CBN_SELCHANGE") EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_COMMANDAnd this is the code from help file. Slightly modified. But working #include <GuiComboBox.au3> #include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> #include <WindowsConstants.au3> Global $g_hCombo Example() Func Example() Local $hGUI ; Create GUI $hGUI = GUICreate("(UDF) ComboBox Create", 400, 296) $g_hCombo = _GUICtrlComboBox_Create($hGUI, "", 2, 2, 396, 296) GUISetState(@SW_SHOW) ; Add files _GUICtrlComboBox_BeginUpdate($g_hCombo) _GUICtrlComboBox_AddDir($g_hCombo, "", $DDL_DRIVES, False) _GUICtrlComboBox_EndUpdate($g_hCombo) GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") ; Loop until the user exits. Do Until GUIGetMsg() = $GUI_EVENT_CLOSE GUIDelete() EndFunc ;==>Example Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg Local $hWndFrom, $iIDFrom, $iCode $hWndFrom = $lParam $iIDFrom = BitAND($wParam, 0xFFFF) ; Low Word $iCode = BitShift($wParam, 16) ; Hi Word Switch $hWndFrom Case $g_hCombo Switch $iCode Case $CBN_CLOSEUP ; Sent when the list box of a combo box has been closed MsgBox(0,"","$CBN_CLOSEUP") Case $CBN_DBLCLK ; Sent when the user double-clicks a string in the list box of a combo box MsgBox(0,"","$CBN_DBLCLK") Case $CBN_DROPDOWN ; Sent when the list box of a combo box is about to be made visible MsgBox(0,"","$CBN_DROPDOWN") Case $CBN_EDITCHANGE ; Sent after the user has taken an action that may have altered the text in the edit control portion of a combo box MsgBox(0,"","$CBN_EDITCHANGE") Case $CBN_EDITUPDATE ; Sent when the edit control portion of a combo box is about to display altered text Case $CBN_ERRSPACE ; Sent when a combo box cannot allocate enough memory to meet a specific request Case $CBN_KILLFOCUS ; Sent when a combo box loses the keyboard focus Case $CBN_SELCHANGE ; Sent when the user changes the current selection in the list box of a combo box MsgBox(0,"","$CBN_SELCHANGE") EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_COMMAND For those who wants the au3 file; Here it is Code From help file.au3 My code.au3
  8. Hi all, I am playing with GUIRegisterMsg function for learning it. This is my code. It is not working. The error msg is this Variable used without being declared.: $tNMHDR = DllStructCreate($tagNMHDR, $lParam) $tNMHDR = DllStructCreate($tagNMHDR, ^ ERROR I can't find lParam as a declared variable in _GUICtrlListView_Create.au3 in help file. #include <ButtonConstants.au3> #include <ComboConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <GUIListBox.au3> #include <WindowsConstants.au3> #include <MouseOnEvent.au3> #include <Alert.au3> #include <ListBoxConstants.au3> Opt("GUIOnEventMode", 1) #Region ### START Koda GUI section ### Form=K:\GUI Reg Msg Test works\GRM test GUI.kxf Global $Form1 = GUICreate("Form1", 611, 430, 260, 140) GUISetFont(12, 400, 0, "Segoe UI") GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close") GUISetOnEvent($GUI_EVENT_MINIMIZE, "Form1Minimize") GUISetOnEvent($GUI_EVENT_MAXIMIZE, "Form1Maximize") GUISetOnEvent($GUI_EVENT_RESTORE, "Form1Restore") Global $Button1 = GUICtrlCreateButton("Button1", 368, 360, 137, 49) GUICtrlSetOnEvent(-1, "Button1Click") Global $List1 = GUICtrlCreateList("", 16, 216, 161, 181) GUICtrlSetOnEvent(-1, "List1Click") Global $Combo1 = GUICtrlCreateCombo("Combo1", 352, 24, 193, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL)) GUICtrlSetOnEvent(-1, "Combo1Change") Global $Input1 = GUICtrlCreateInput("Input1", 48, 32, 169, 33) GUICtrlSetOnEvent(-1, "Input1Change") Global $Edit1 = GUICtrlCreateEdit("", 248, 80, 321, 161) GUICtrlSetData(-1, "Edit1") GUICtrlSetOnEvent(-1, "Edit1Change") GUIRegisterMsg($WM_NOTIFY,"List1Click") GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### Local $tmp = ["Orange","Apple","Banana","Papaya","Grapes"] For $i = 0 to 4 GUICtrlSetData($List1,$tmp[$i]) Next While 1 Sleep(100) WEnd Func List1Click($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg Local $hWndFrom,$iIDfrom, $iCode, $tNMHDR, $hWndList, $tInfo $hWndList = $List1 if Not IsHWnd($List1) Then $hWndList = GUICtrlGetHandle($List1) $tNMHDR = DllStructCreate($tagNMHDR, $lParam) $hWndFrom = HWnd(DllStructGetData($tNMHDR,"hWndFrom")) $iIDfrom = DllStructGetData($tNMHDR,"IDFrom") $iCode = DllStructGetData($tNMHDR, "Code") Switch $hWndFrom Case $List1 Switch $iCode Case $LBN_DBLCLK ;$tInfo = DllStructCreate($tagNMMOUSE) Alert("You Clicked Twice") EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFuncThis gui is only for learning pupose. So please don't mind its aesthetic style.
  9. Dear all (and especially Martin, if available), I am working on a GUI that reads the signals from a gas flow meter (ProFLow 6000, by Restek). In the manual of the device, there are the instructions for how to read the signal using a computer via comm ports. I can do it using the CommMG.au3 UDF by Martin, it works fine. However, I am trying to make a GUI in which there are 2 buttons: start and stop, the start button starts the reading of the comm port signal, and the stop button stops it. I did this following the tutorial available on https://www.autoitscript.com/wiki/Interrupting_a_running_function , more specifically the first example for GUI message loop mode that employs GUIRegisterMsg as a way to enable a function to stop another. It works, the start function is stopped by the stop button. However, if I try to start again, it does not work. I press the start button and nothing happens. I must say that this only happens if I use a function to read the comm port. For other kinds of functions, for example, reading the computer clock, there is no problem, after stopping I can re-start again. My question is: how to make it possible to re-start the reading function for the Comm port once it was stopped using the GUIRegisterMsg? Below goes my code (sorry, it is my first time and I am not sure of the best way of pasting it here). If includes also the clock button that can be used to test the stopping process (it should work). #include "commMG.au3" #include <GUIConstantsEx.au3> #include <ColorConstants.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> Local $FlowMeterPort Local $PortError $Interrupt_flag = 0 $FlowMeter = GUICreate("Flow meter reader", 200, 160, 500, 200) $Reading = GUICtrlCreateLabel("",20,40,120,18) GUICtrlSetBkColor($Reading,$COLOR_WHITE) $Start = GUICtrlCreateButton("Start", 20, 60, 50, 20) $Stop = GUICtrlCreateButton("Stop", 20, 80, 50, 20) $Clock = GUICtrlCreateButton("Clock", 20, 100, 50, 20) $FlowMeterPort = InputBox("Flow meter reader","Welcome to the flow meter reader! Please type in the number of the COM port connecting the computer to the flow meter. If you do not know, go to Control Panel, Hardware settings, and try to find it among the listed COM ports.") GUISetState() GUIRegisterMsg($WM_COMMAND, "FlowMeter_WM_COMMAND") While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit Case $Start _CommSetPort($FlowMeterPort, $PortError, 115200, 8, 0, 1, 2) $Interrupt_flag = 0 While $Interrupt_flag = 0 $FlowMeterReading = _CommReadString(100) GUICtrlSetData($Reading,$FlowMeterReading) WEnd Case $Clock $Interrupt_flag = 0 While $Interrupt_flag = 0 GUICtrlSetData($Reading,@HOUR & @MIN & @SEC) WEnd EndSwitch WEnd Func FlowMeter_WM_COMMAND($hWnd, $Msg, $wParam, $lParam) If BitAND($wParam, 0x0000FFFF) = $Stop Then $Interrupt_flag = 1 EndFunc Func _CommReadString($TimeSpan) Local $Reading $Start = TimerInit() $End = 0 $ReadStep = 0 While $End < $TimeSpan $Reading = $Reading & _Commgetstring() $End = TimerDiff($Start) If $Reading <> '' Then $ReadStep = $ReadStep + 1 EndIf If $ReadStep > 100 Then $End = $TimeSpan Sleep(0) WEnd Return $Reading EndFunc ;==>_CommReadString
  10. Hi, There's an external window that I would like to set a minimum window size on. I've seen this is possible for internal GUI windows using GUIRegisterMsg and WM_GETMINMAXINFO. So, is it possible to do the same thing but on an external window? Thanks, Fidel
  11. Is there an easier (proper) way of detecting a change in the state of a checkbox other than comparing the checkbox text like I have done below? Is there a way of using and comparing the checkbox handle rather than its text? #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> $Gui = GUICreate("WM_COMMAND", 390, 220) $Checkbox1 = GUICtrlCreateCheckbox("Checkbox1", 10, 40, 90, 17) $Checkbox2 = GUICtrlCreateCheckbox("Checkbox2", 10, 60, 90, 17) GUISetState() GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") Do Until GUIGetMsg() = -3 Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam) Local $nID = BitAND($wParam, 0x0000FFFF) ; _WinAPI_LoWord Local $nNotifyCode = BitShift($wParam, 16) ; _WinAPI_HiWord If GUICtrlRead($nID, 1) = "Checkbox1" Then MsgBox(0, '', 'Checkbox1 has been modified') ; do some non-blocking code here If GUICtrlRead($nID, 1) = "Checkbox2" Then MsgBox(0, '', 'Checkbox2 has been modified') ; do some non-blocking code here Return $GUI_RUNDEFMSG EndFunc
  12. Hello Folks, I'm not an AutoIt noob but I am new to the GuiRegisterMsg command. What I am trying to do is to pop up a "long string edit" window when user double-clicks. Ideally I wanted it to be a duouble-click in the Input box itself but I couldn't get this to work so I was going to settle for a double-click *near* the input box. Here's a severely curtailed version of my almost 1300-line script. From the msgbox "tell-tale" it appears that the GuiRegisterMsg definition interferes with the GuiGetMsg function and it 'remembers' the last GuiGetMsg return value -- is there some way to 'flush' the holding area? Note that there are bits in there from experiments -- if I comment out the While-Wend and replace it with the sleep line you can better see what I am trying to acheive. The list box is just to give a different kind of control than an input field to have the focus, it's contents are not relevant to the snippet, only to the full app. All help gratefully acknowledged! Here's the code snippet: #include <WindowsConstants.au3> #include <ButtonConstants.au3> #include <GuiConstantsEx.au3> #include <EditConstants.au3> #include <ListBoxConstants.au3> Dim $InputFileId Dim $OutputFileId Dim $winMain Dim $GUIMsg GUIRegisterMsg($WM_LBUTTONDBLCLK, "EditText") $winMain = GUICreate ("Test for Editing Long Strings", 800, 560, -1, -1) GUICtrlCreateLabel("File to Process", 22,30) GUICtrlCreateLabel("Output File", 40,60) $InputFileId = GUICtrlCreateInput ( "", 100, 25, 400, 20) $OutputFileId = GUICtrlCreateInput ( "", 100, 55, 400, 20) $btnInputFile = GUICtrlCreateButton ( "Browse for File", 520, 22, 110, 25) $btnOPFolder = GUICtrlCreateButton ( "Browse for Location", 520, 53, 110, 25) ; Create the list of actions $ActionList = GUICtrlCreateList( "", 25, 260, 70, 200) GUICtrlSetData($ActionList, "Delete|Exclude|Include|Insert|Kill Blanks|Move|Remove|Replace|Switch", "Delete") GUISetState(@SW_SHOW, $winMain) While 1 $GUIMsg = GUIGetMsg() Switch $GUIMsg Case $GUI_EVENT_CLOSE ExitLoop Case $btnInputFile MsgBox(0, "Info", "Input Button pressed") Case $btnOPFolder MsgBox(0, "Info", "Output Button pressed") EndSwitch WEnd Func EditText($Window, $Caller, $p1, $p2) Dim $winEdit Dim $CtrlName Dim $edtString Dim $btnAccept Dim $btnReject Dim $Response Dim $RetString Dim $CtrlId Dim $ActCode Dim $HasFocus $CtrlName = ControlGetFocus("Test for Editing Long Strings") msgbox(0,"DOUBLE-CLICK!","Control: " & $CtrlId & @CRLF & "Action: " & $ActCode & @CRLF & "CtrlName: " & $CtrlName) If StringInStr($CtrlName,"Edit") > 0 Then $winEdit = GUICreate("Long String Editor", 790, 100, -1, -1, $WS_BORDER) $edtString = GUICtrlCreateEdit("This is a potentially long string", 5, 5, 780, 20, $ES_AUTOHSCROLL) $btnAccept = GUICtrlCreateButton( "Accept String", 240, 33, 100, 30) $btnReject = GUICtrlCreateButton( "Reject String", 440, 33, 100, 30) GUISetState(@SW_SHOW, $winEdit) GUICtrlSetState($edtString, $GUI_FOCUS) ; sleep(5000) ;#cs While 1 $Response = GUIGetMsg() if $Response = $btnAccept Then ExitLoop EndIf Select Case $Response = $btnReject ExitLoop Case $Response = $btnAccept ; GUICtrlSetData($CtrlName, $RetString) ExitLoop Case Else $RetString = GUICtrlRead($edtString) EndSelect WEnd ;#ce Else Return $GUI_RUNDEFMSG EndIf GUICtrlSetData($CtrlName, $RetString) GUIDelete($winEdit) Return $GUI_RUNDEFMSG EndFunc
  13. I'm making a little chat client, and I'm using Melbas GUIFrame (). I want it, so that when I re-size the window (with min/max sizes) it re-sizes the input and history boxes to match the new window size. That's working fine with re-sizing the whole GUI (using GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO")), but when I try to move the frame separator bar, the history box (since it's made with _GUICtrlRichEdit instead of GUICtrlEdit) doesn't update until after you're finished moving the separator. Using the other GUIRegisterMsg, the history edit re-sizes instantly as you move the separator bar, but the other controls in the window don't change at all. Using both at once causes only the second one to work. Is there a way to have both things happen (re-size edits on window and separator bar re-size)? #include <GUIRichEdit.au3> #include <WindowsConstants.au3> #include <EditConstants.au3> #include <WinAPI.au3> #include <GUIEdit.Au3> #include "GUIFrame.au3" #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> Local $GUIMINWID = 300, $GUIMINHT = 100 ;Min window sizes Local $GUIMAXWID = @DesktopWidth, $GUIMAXHT = @DesktopHeight ;Max window sizes $hGUI = GUICreate('MEOW', 500, 300, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX)) GUISetState(@SW_SHOW) $iFrames = _GUIFrame_Create($hGUI, 0, 200) ;Creation of the two GUI frames _GUIFrame_ResizeSet(0, 1) ;Required for proper resizing _GUIFrame_ResizeReg() ;Required for proper resizing _GUIFrame_SetMin($iFrames, 150, 200, True) ;Set frame min size _GUIFrame_Switch($iFrames, 2) ;Switch to second frame to create controls $History = _GUICtrlRichEdit_Create(_GUIFrame_Switch($iFrames, 2), 'adsfadsfasdf', 2, 2, 263, 255) $Input = GUICtrlCreateEdit('', 2, 272, 293, 20, BitOR($ES_AUTOVSCROLL, $ES_WANTRETURN, $WS_BORDER), $WS_EX_STATICEDGE) GUICtrlSetFont(-1, 10, 400, 0, "Courier New") GUICtrlSetResizing(-1, 582) ;Resizing parameters GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO") ;~ GUIRegisterMsg($WM_SIZE, "WM_SIZE") $SepPos = _GUIFrame_GetSepPos($iFrames) ;Get the seperator bars current position While 1 Sleep(10) If $SepPos <> _GUIFrame_GetSepPos($iFrames) Then History_Resize() Switch GUIGetMsg() Case $GUI_EVENT_CLOSE _GUICtrlRichEdit_Destroy($History) Exit EndSwitch WEnd Func WM_GETMINMAXINFO($hwnd, $Msg, $wParam, $lParam) $tagMaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam) DllStructSetData($tagMaxinfo, 7, $GUIMINWID) ; min X DllStructSetData($tagMaxinfo, 8, $GUIMINHT) ; min Y DllStructSetData($tagMaxinfo, 9, $GUIMAXWID); max X DllStructSetData($tagMaxinfo, 10, $GUIMAXHT) ; max Y History_Resize() Return 0 EndFunc ;==>WM_GETMINMAXINFO Func WM_SIZE($hwnd, $iMsg, $wParam, $lParam) History_Resize() EndFunc ;==>WM_SIZE Func History_Resize() $SepPos = _GUIFrame_GetSepPos($iFrames) $hGpos = WinGetPos($hGUI) $iPos = ControlGetPos($hGUI, '', 'Edit1') _WinAPI_MoveWindow($History, 2, 2, ($hGpos[2] - $SepPos) - 50, $hGpos[3] - $iPos[3] - 55, False) EndFunc ;==>History_Resize
  14. Hi ppl, i need a little help! I'm trying to understand how to use the GuiRegisterMsg(), and in this teste above: why it capture the click on Button, but not capture the click in the tab? how to use it correctly? #include <GuiTab.au3> #include <WindowsConstants.au3> #include <GUIConstantsEx.au3> $Gui = GUICreate("Test", 300, 300, -1, -1) $tab = _GUICtrlTab_Create($Gui, 0, 0, 300, 300) _GUICtrlTab_InsertItem($tab, 0, "Tab 1") $button = GUICtrlCreateButton("Button test", 100, 100) _GUICtrlTab_InsertItem($tab, 1, "Tab 2") _GUICtrlTab_SetItem($tab, 0) GUISetState() GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND") While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd Func _WM_COMMAND($hWnd, $msg, $wParam, $lParam) Local $nID = BitAND($wParam, 0x0000FFFF) Switch $nID Case $button MsgBox(0,'','Click on Button') Case $tab MsgBox(0,'','Click on Tab') EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>MY_WM_COMMAND thanks a lot!
  15. Hello everyone. I want to run a function when a GUI window is resized. However, when I click to resize the GUI, before I actually drag the corner of the GUI it runs and prevents me from resizing the GUI. I was hoping that I would be able to make this message run once the GUI has finished running. Would this be possible? Thanks Edit I have solved it. The answer: GUISetOnEvent($GUI_EVENT_RESIZED, 'WM_SIZE', $hWnd)
×
×
  • Create New...