WM_Command & Wertebereich im HighWord unterbringen

  • Hey,


    ein kleines Problem:
    Ich möchte möglist viel vom Wertebereich 0-2147483647 im Highword einer WM_Command Nachricht unterbringen.

    Soweit ich das verstanden habe ist im Highword maximal Platz für den Bereich −32.768 bis 32.768.

    D.h. man könnten den Bereich von −32.768 bis -1 ausnutzen.
    Hier ein Versuch:

    Spoiler anzeigen
    [autoit]


    #include <Winapi.au3>

    [/autoit] [autoit][/autoit] [autoit]

    global const $lowword=1000

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $ihighword_1=32767*2
    Global $ihighword_2=0
    Global $ihighword_3=32768

    [/autoit] [autoit][/autoit] [autoit]

    Global $ilongword_1=_CreateLong($lowword, $ihighword_1)
    Global $ilongword_2=_CreateLong($lowword, $ihighword_2)
    Global $ilongword_3=_CreateLong($lowword, $ihighword_3)

    [/autoit] [autoit][/autoit] [autoit]

    ;ConsoleWrite($ilongword_1 &@crlf)
    ;ConsoleWrite($ilongword_2 &@crlf)
    ;ConsoleWrite($ilongword_3 &@crlf)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $ihighword_return_1=_get_highword($ilongword_1)
    Global $ihighword_return_2=_get_highword($ilongword_2)
    Global $ihighword_return_3=_get_highword($ilongword_3)

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite($ihighword_return_1 &@crlf)
    ConsoleWrite($ihighword_return_2 &@crlf)
    ConsoleWrite($ihighword_return_3 &@crlf)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _CreateLong($lo_word, $hi_word)
    if $hi_word > 32767 then $hi_word-=65535
    ;ConsoleWrite("Hiword createlong :"&$hi_word&@crlf)
    return _WinAPI_MakeLong($lo_word, $hi_word)
    endfunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    func _get_highword($long_word)
    ; dieser Teil ist zeitkritisch

    [/autoit] [autoit][/autoit] [autoit]

    local $itemp=_WinAPI_HiWord($long_word)
    if $itemp <0 then $itemp+=65535
    ;ConsoleWrite("Hiword itemp :"&$itemp&@crlf)
    return $itemp
    endfunc

    [/autoit]

    Sind die Überlegungen so richtig?
    Gibt es eine Methode um einen noch größeren Wertebereich zu erfassen?

    Die Funktion _get_highword ist möglicherweise etwas zeitkritisch, da die WM_Command Funktion im eigentlichen Skript auf Fernbedienungsanschläge reagieren soll.
    Wie sich das praktisch darstellt weiss ich noch nicht.
    Zu zeitaufwendige Algos sind eher nicht drin, aber vielleicht habt ihr ja einen schlauen Trick auf lager :thumbup:


    Gruß nuts

    Einmal editiert, zuletzt von nuts (6. Mai 2011 um 13:35)

  • Der Wertebereich 0-2147483647 wird durch eine Drittanwendung vorgegeben.

    Mal genauer:

    Eventghost lauert noch Fernbedienungsanschlägen und sendet auf ein Event eine Nachricht über Sendmessage an mein Skript.
    WM_Command müsste hier nicht unbedingt sein, ist aber einfach zu machen und imho relativ schnell.

    Anschließend übersetzt mein Skript die Nachricht in eine Objektanweisung (DVBViewer)

    [autoit]

    $odvbviewer.sendcommand($hi_word)

    [/autoit]


    Um das ganze möglichst effektiv zu halten sind die Nachrichten im Eventghost-Plugin schon DVBViewer gerecht (zumindest 0-32767) hinterlegt.

    Soweit ok.
    Nur dann ist mir aufgefallen, dass ich den Wertebereich von 0-2147483647 gar nicht komplett unterbringen kann.
    Komplett wird der Bereich derzeit (aber wer weiss?) nicht verwendet, eher so im Bereich 0-50000.

    Einmal editiert, zuletzt von nuts (6. Mai 2011 um 15:06)