ControlID durch Handle+Position herrausfinden

  • Nabend ;)

    Ein Freund und ich haben ein witziges tool mit udp geschrieben, mit dem man die maus des freundes auf seinem bildschirm sieht.... damit diese auch agieren (klicken und ähnliches) kann, ohne dass die normale maus eingeschränkt wird, dachten wir an controlklick... ich habe schon eine udf gebastel, die das unter einer position liegende fenster controlhandle zurück gibt, aber leider braucht man für controlklick auch noch eine controllID.
    Habt ihr eine Idee, wie man diese durch das wissen des handles und der position des "2en" Cursors herausfinden kann?
    Das AutoitInfo tool beweißt ja die möglichkeit dessen.
    Danke schon im vorraus :thumbup:

  • Poste doch pls ma den prog code-Ich will wissen wie du das gemacht hast :D
    Oda is der code "betribsgeheimnis"? :rolleyes:

    Theorie ist wenn man weiß wie's geht, aber nichts klappt.
    Praxis ist wenn's klappt aber man weiß nicht weiso.

    Bei Microsoft sind Theorie und Praxis vereint: Nichts klappt und keiner weiß wieso ;)

  • lol, dllcall, dllstructcreate, dllstructsetdata, dllstructgetdata, die User32.dll und https://autoit.de/www.msdn.com sind die zutaten dafür...
    hier dann das ergebnis ;)
    :

    [autoit]

    MsgBox(0, "HWND", _GetCaptureWindow(1, 1) & @CRLF & ControlGetHandle("Program Manager", "FolderView", 1))

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

    Func _GetCaptureWindow($x, $y)
    Local $tagPOINT = "int X;int Y"
    Local $tPOINT, $call
    $tPOINT = DllStructCreate($tagPOINT)
    DllStructSetData($tPOINT, 1, $x)
    DllStructSetData($tPOINT, 2, $y)
    $x = DllStructGetData($tPOINT, "X")
    $y = DllStructGetData($tPOINT, "Y")
    $call = DllCall("User32.dll", "hwnd", "WindowFromPoint", "int", $x, "int", $y)
    If @error Then Return SetError(@error, 0, 0)
    $tPOINT = 0
    Return $call[0]
    EndFunc ;==>_GetCaptureWindow by Deathly Assassin

    [/autoit]

    doch ich habe nicht das gefühl, dass du immoment sonderlich viel davon verstehen wirst ;)

  • Ich versuch mal dlls zu verstehen ;)
    Bei mir wärs eher mit mousegetpos () und so gewesen 8|

    Ich versuch mal dich in sachen dll zu überholen :D

    Theorie ist wenn man weiß wie's geht, aber nichts klappt.
    Praxis ist wenn's klappt aber man weiß nicht weiso.

    Bei Microsoft sind Theorie und Praxis vereint: Nichts klappt und keiner weiß wieso ;)

  • Zitat

    Bei mir wärs eher mit mousegetpos () und so gewesen 8|


    wie willst du mit mousegetpos ein fensterhandle bekommen? ;D

    Zitat

    Ich versuch mal dich in sachen dll zu überholen :D


    na denn mal viel erfolg xD

    naja... genug dazu... würd mich freuen, wenn jemand eine Lösung für meine eigentliche frage perat hätte 8o

  • Hi

    Wenn die Position über einem Control ist, dann bekommt man mit WindowFromPoint Handle vom Control, ansonsten vom Window.
    darum sollte es eigentlich funktionieren:
    (zumindest ist das Ergebnis identisch mit AutoitInfo)

    [autoit]

    $tPoint=DllStructCreate($tagPOINT)
    DllStructSetData($tPOINT , "X", $iX)
    DllStructSetData($tPOINT , "Y", $iY)
    $hWnd=_WinAPI_WindowFromPoint($tPOINT)
    ControlClick(WinGetHandle(""),"",$hWnd)

    [/autoit]

    Aber warum benuzt du nicht einfach

    [autoit]

    MouseClick

    [/autoit]

    ?
    Oda hab ich was nicht verstanden ;)

  • MouseClick geht aus dem Grund nicht, da dann immer die eigene Maus dorthin bewegt wird....
    ControlClick(WinGetHandle(""),"",$hWnd) kann ich zwar so nicht funktionierend benutzenn, aber es hat mich auf eine idee gebracht, die ich jetzt versuchen werde ;D

  • ok.... habs hinbekommen =D

    was jetzt noch nicht funktoniert:
    es kann nicht auf die fenster buttons "minimieren", "restor" oder den "exit" button geklickt werden... desweiteren kann man nicht auf trayicns und die maus kann nicht auf das rechtsklickmenue klicken/verschwindet darunter.

    ansonsten ist schon alles echt nice ;)
    Hättet ihr vielleicht noch eine Lösung dafür? Ich hab schon versucht immer den $WM_PAINT befehl an das fenster zu schicken, was leider kein effeckt auf oben genanntes hatte.

  • Falls du erkennen kannst, daß ein ControlClick nicht funktionieren wird, dann kannst du in diesem Fall ein MouseClick machen.
    Und zwar zuerst Mausposition speichern und nach dem Click wieder zurücksetzten (mit Speed 0).

    Das behindert zwar die richtige Maus für ein paar wenige ms, aber es würde funktionieren...

  • Zitat

    Falls du erkennen kannst, daß ein ControlClick nicht funktionieren wird


    Ist wohl schlecht möglich(zwar nicht unmöglich aber trotzdem doof) ;)

    sonst noch wer eine idee, wie man einer Gui das selbe topmost geben kann, dass auch der cursor hat?