Sign in to follow this  
Followers 0
SkinnyWhiteGuy

Question about GUIRegisterMsg

11 posts in this topic

I was planning on using GUIRegisterMsg to watch for a lot of events on a window (network stuff, related to Zatorg's ASock stuff), so I was doing my research to see if any errors might pop up. On reading the reference for GuiRegisterMsg, I came across this:

Up to 256 user functions can be registered for message ID's.

Reading it as is, in my mind, that means I can only have 256 unique functions being pointed to, but if I use the same function for a number of message ID's, I'm not limited. But, that would seem wrong to me, since then I could register every message under the sun, make them all point to one function, and then switch out from there, and with such a simple solution, I would figure that would be how AutoIt did it internally, and just wouldn't have a limit to begin with.

Am I just over thinking this, or can I have more than 256 message ID's pointed at the same function and everything run just fine?

Share this post


Link to post
Share on other sites



I was confused too... so I just created a simple script with a GUI and registered all 446 IDs to a single function and the script runs without error (attached). I know the GUIRegisterMsg() function does not like MsgBoxes but I was just trying to prove a point.

test2.au3


Certifications: A+, Network+, Security+, Linux+, LPIC-1, MCSA | Languages: AutoIt, C, SQL, .NETBooks: AutoIt v3: Your Quick Guide - $7.99 - O'Reilly Media - September 2007-------->[u]AutoIt v3 Development - newbie to g33k[/u] - Coming Soon - Fate Publishing - Spring 2013UDF Libraries: SkypeCOM UDF Library | ADUC Computers OU Cleanup | Find PixelChecksumExamples: Skype COM Examples - Skype4COMLib Examples converted from VBS to AutoIt

Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

I was confused too... so I just created a simple script with a GUI and registered all 446 IDs to a single function and the script runs without error (attached). I know the GUIRegisterMsg() function does not like MsgBoxes but I was just trying to prove a point.

I wouldn't call that simple, this I call simple:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>

GUICreate("Test",400,400)
GUICtrlCreateButton("Test Button 1",10,10,380)
GUICtrlCreateButton("Test Button 2",10,10,380)

For $X = 0x0000 To 0x8000
    GuiRegisterMsg($X, "MyFunction")
Next

GUISetState()

Do
    Sleep(10)
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func MyFunction($hWnd, $Msg, $wParam, $lParam)
    $nNotifyCode = BitShift($wParam, 16)
    $nID = BitAND($wParam, 0x0000FFFF)
    $hCtrl = $lParam
    ConsoleWrite("GUIHWnd" & @TAB & ":" & $hWnd & @LF & _
        "MsgID" & @TAB & ":" & $Msg & @LF & _
        "wParam" & @TAB & ":" & $wParam & @LF & _
        "lParam" & @TAB & ":" & $lParam & @LF & @LF & _
        "WM_COMMAND - Infos:" & @LF & _
        "-----------------------------" & @LF & _
        "Code" & @TAB & ":" & $nNotifyCode & @LF & _
        "CtrlID" & @TAB & ":" & $nID & @LF & _
        "CtrlHWnd" & @TAB & ":" & $hCtrl & @CRLF & @CRLF)
    Return $GUI_RUNDEFMSG
EndFunc

Only a few thousand GuiRegisterMsg() and it still start in about 1 sec. :P

Edit: Made it even simpler :( muttley :)

Edited by AdmiralAlkex

Share this post


Link to post
Share on other sites

I wouldn't call that simple, this I call simple

Nice. muttley I only used the IDs listed in the help file to make sure that if I did get an error that it was related to the GuiRegisterMsg()'s. It didn't take me long to build that list; I used the same type of For...Next loop to output the 446 lines in my example.

You must be bored. LOL


Certifications: A+, Network+, Security+, Linux+, LPIC-1, MCSA | Languages: AutoIt, C, SQL, .NETBooks: AutoIt v3: Your Quick Guide - $7.99 - O'Reilly Media - September 2007-------->[u]AutoIt v3 Development - newbie to g33k[/u] - Coming Soon - Fate Publishing - Spring 2013UDF Libraries: SkypeCOM UDF Library | ADUC Computers OU Cleanup | Find PixelChecksumExamples: Skype COM Examples - Skype4COMLib Examples converted from VBS to AutoIt

Share this post


Link to post
Share on other sites

Well, it's one thing to register them all, I figured that might work. What I was wondering, was would anything after the 255th message actually work if you sent that message to that Gui? (And just as a side note, I'm only using messages above WM_USER for this).

I might play with some of your examples, and see if I can include a test to show it working as it should. Maybe do _SendMessage() in a loop, going back over those same messages with a consolewrite...

Share this post


Link to post
Share on other sites

Well, it's one thing to register them all, I figured that might work. What I was wondering, was would anything after the 255th message actually work if you sent that message to that Gui? (And just as a side note, I'm only using messages above WM_USER for this).

I might play with some of your examples, and see if I can include a test to show it working as it should. Maybe do _SendMessage() in a loop, going back over those same messages with a consolewrite...

I was betting on the function having a check to verify that there are less than 256 connections before allowing the registration (and spitting out an error). It never hurts to do what you're proposing, though.

Certifications: A+, Network+, Security+, Linux+, LPIC-1, MCSA | Languages: AutoIt, C, SQL, .NETBooks: AutoIt v3: Your Quick Guide - $7.99 - O'Reilly Media - September 2007-------->[u]AutoIt v3 Development - newbie to g33k[/u] - Coming Soon - Fate Publishing - Spring 2013UDF Libraries: SkypeCOM UDF Library | ADUC Computers OU Cleanup | Find PixelChecksumExamples: Skype COM Examples - Skype4COMLib Examples converted from VBS to AutoIt

Share this post


Link to post
Share on other sites

Yeah, it sure doesn't....

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <SendMessage.au3>

GUICreate("Test",400,400)

For $X = 0x0400 To 0x8000
    GuiRegisterMsg($X, "MyFunction")
Next

Sleep(1000)

For $X = 0x0400 To 0x8000
    _SendMessage(WinGetHandle("Test"), $X)
Next

Func MyFunction($hWnd, $Msg, $wParam, $lParam)
    ConsoleWrite("GUIHWnd" & @TAB & ":" & $hWnd & @LF & _
        "MsgID" & @TAB & ":0x0000" & Hex($Msg, 4) & @LF & _
        "wParam" & @TAB & ":" & $wParam & @LF & _
        "lParam" & @TAB & ":" & $lParam & @CRLF & @CRLF)
EndFunc

muttley

Share this post


Link to post
Share on other sites

Yeah, it sure doesn't....

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <SendMessage.au3>

GUICreate("Test",400,400)

For $X = 0x0400 To 0x8000
    GuiRegisterMsg($X, "MyFunction")
Next

Sleep(1000)

For $X = 0x0400 To 0x8000
    _SendMessage(WinGetHandle("Test"), $X)
Next

Func MyFunction($hWnd, $Msg, $wParam, $lParam)
    ConsoleWrite("GUIHWnd" & @TAB & ":" & $hWnd & @LF & _
        "MsgID" & @TAB & ":0x0000" & Hex($Msg, 4) & @LF & _
        "wParam" & @TAB & ":" & $wParam & @LF & _
        "lParam" & @TAB & ":" & $lParam & @CRLF & @CRLF)
EndFunc

muttley

Might take a few hours to run :), but it seems to work. :(

Certifications: A+, Network+, Security+, Linux+, LPIC-1, MCSA | Languages: AutoIt, C, SQL, .NETBooks: AutoIt v3: Your Quick Guide - $7.99 - O'Reilly Media - September 2007-------->[u]AutoIt v3 Development - newbie to g33k[/u] - Coming Soon - Fate Publishing - Spring 2013UDF Libraries: SkypeCOM UDF Library | ADUC Computers OU Cleanup | Find PixelChecksumExamples: Skype COM Examples - Skype4COMLib Examples converted from VBS to AutoIt

Share this post


Link to post
Share on other sites

#10 ·  Posted (edited)

Try this script, I got 32768 answered messages in about 11.205 sec. That's almost to good to be true muttley

#include <GUIConstantsEx.au3>
#Include <SendMessage.au3>

$Messages = 0

$GUI = GUICreate("Test",400,400)

For $X = 0x8000 To 0xFFFF
    GuiRegisterMsg($X, "MyFunction")
Next

For $X = 0x8000 To 0xFFFF
    _SendMessage($GUI, $X)
    If @error = 0 Then $Messages +=1
Next

ConsoleWrite("Messages answered to= " & $Messages & @CRLF)

Func MyFunction($hWnd, $Msg, $wParam, $lParam)
    Return
EndFunc
Edited by AdmiralAlkex

Share this post


Link to post
Share on other sites

The one I posted actually only took around 20 seconds to run all the way (Core 2 Duo, 2 GB RAM). Seems that, it works just as it reads.

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0