Beiträge von Aaron3569
-
-
Hallo, ich habe folgendes Problem: Wenn ich ein Child Window über _WinAPI_UpdateLayeredWindowEx mit einem Bild versehe, scheint es beim Scrollen des Parent Windows Clipping Probleme zu geben. Es kommt immer wieder vor das bei einem scroll der Inhalt des Child Windows dann für einen kurzen Moment außerhalb des Parent Windows zu sehen ist. Könnt ihr den Beispielcode mal ausprobieren und sehen ob ihr das auch habt? ladet einfach eine beliebige Bilddatei , am besten eine etwas größere um den Effekt bessere zu sehen und dann einfach starten und schnell hoch und runter scrollen, entsprechend sollte dann irgendwann das Bild oben oder unten "raus clippen". Es ist sehr random also dauert es manchmal ein paar scrolls. Jemand eine Idee? leider habe ich keinen weg gefunden es sauber zu clippen wie es sonst ist wenn man normale Child Windows benutzt.
C
Alles anzeigen#include <GUIConstantsEx.au3> #Include <WindowsConstants.au3> #include <WinAPIConv.au3> #include <GuiScrollBars.au3> #include <GDIPlus.au3> #include <WinAPISysWin.au3> GUIRegisterMsg($WM_MOUSEWHEEL, "_WM_MOUSEWHEEL") $hParent = GUICreate("Test", 900, 500, -1, -1) GUISetState(@SW_SHOW, $hParent) _GDIPlus_Startup() $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\texture.jpg") $hChild = GUICreate("Child", 150, 150, 0, 0, $WS_CHILD, $WS_EX_LAYERED, $hParent) _WinAPI_UpdateLayeredWindowEx($hChild, -1, -1, _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage), 255, true) GUISetState(@SW_SHOW, $hChild) _GUIScrollBars_Init($hParent, -1, 100) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd Func _WM_MOUSEWHEEL($hwnd, $Msg, $wParam, $lParam) Local $iCurScrollPos = _GUIScrollBars_GetScrollInfoPos($hWnd, $SB_VERT) Switch _WinAPI_HiWord($wParam) / 120 Case -1 _GUIScrollBars_SetScrollInfoPos($hWnd, $SB_VERT, $iCurScrollPos + 5) Case 1 _GUIScrollBars_SetScrollInfoPos($hWnd, $SB_VERT, $iCurScrollPos - 5) EndSwitch EndFunc
-
Guten Tag, ich würde gerne die im Titel stehende Windows Funktion mit Autoit Triggern. Ich suche einen Weg die Taskleiste ausblenden zu lassen, jedoch soll diese wieder erscheinen sobald ich mit der Maus an die ursprüngliche Position der Taskleiste gehe, also genau so wie es die genannte Funktion tut. Bis jetzt habe ich leider nur die Möglichkeit gefunden die Taskleiste komplett verschwinden zu lassen, natürlich wäre es möglich mit einem kleinen Script einfach die Maus Position abzufragen und entsprechend die Taskleiste wieder anzeigen zu lassen, jedoch würde es mich interessieren ob es möglich ist die Windows Funktion direkt zu triggern.
Edit: Lösung gefunden, hier ein kurzes Beispiel:
AutoIt
Alles anzeigenGlobal Const $ABM_GETSTATE = 0x04 Global Const $ABM_SETSTATE = 0x0000000a Global Const $ABS_ALWAYSONTOP = 0x2 Global Const $ABS_AUTOHIDE = 0x1 Global $pabd = DllStructCreate("dword;int;uint;uint;int;int;int;int;int") DllStructSetData($pabd, 1, DllStructGetSize($pabd)) ;cbSize DllStructSetData($pabd, 2, ControlGetHandle("Start", "", "Shell_TrayWnd")) ;hWnd _SetTrackbarState($ABS_AUTOHIDE) ConsoleWrite("Taskbar im Autohide Mode: " & _GetTrackbarState() & @CRLF ) Sleep(2000) _SetTrackbarState($ABS_ALWAYSONTOP) ConsoleWrite("Taskbar im Autohide Mode: " & _GetTrackbarState() & @CRLF ) Func _SetTrackbarState($iTrackbarState) DllStructSetData($pabd, 9, $iTrackbarState) SHAppBarMessage($ABM_SETSTATE, $pabd) EndFunc ;==>_SetTrackbarState Func _GetTrackbarState() Return SHAppBarMessage($ABM_GETSTATE, $pabd) ; returns False wenn Taskbar ist sichtbar , returns 1 wenn Taskbar ist im Autohide Mode. EndFunc ;==>_GetTrackbarState Func SHAppBarMessage($Message, ByRef $pabd) $lResult = DllCall("shell32.dll", "int", "SHAppBarMessage", "int", $Message, "ptr", DllStructGetPtr($pabd)) If Not @error Then If $lResult[0] Then Return $lResult[0] EndIf EndIf SetError(1) Return False EndFunc ;==>SHAppBarMessage
-
Guten Abend,
ich versuche gerade eine Möglichkeit zu finden die es erlaubt ein Fenster in einem anderen einzubetten welches sich dann wie ein herkömmliches Guictrl verhält, also beim Scrollen durch das Parent Window darf sich das Child Window nicht bewegen. Das habe ich soweit mit folgendem Code hinbekommen, leider verschwindet die Child GUI beim bewegen / minimieren des Parents. Ich denke es hat mit den GUI Styles zu tun ? würde mich über Hilfe freuen
C
Alles anzeigen#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <GuiScrollBars.au3> HotKeySet("{RIGHT}", "ScrollRight") HotKeySet("{LEFT}", "ScrollLeft") $hParent = GUICreate("Parent", 1300, 800, -1, -1) GUICtrlCreateButton("Button", 150, 150, 150, 50) GUISetState() $hChild = GUICreate("Child", 100, 100, -1,-1, $WS_CHILD , $WS_EX_MDICHILD, $hParent) GUISetBkColor(0x000000) GUISetState() _GUIScrollBars_Init($hParent, 10000) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd Func ScrollRight() _GUIScrollBars_SetScrollInfoPos($hParent, $SB_HORZ, _GUIScrollBars_GetScrollInfoPos($hParent, $SB_HORZ) + 5) EndFunc Func ScrollLeft() _GUIScrollBars_SetScrollInfoPos($hParent, $SB_HORZ, _GUIScrollBars_GetScrollInfoPos($hParent, $SB_HORZ) - 5) EndFunc
-
guten Abend,
Ich Arbeite gerade an einem Projekt bei welchem ich nun an einem Punkt angekommen bin, wo ich eine Art Blueprint - System ähnlich wie bei der Unreal Engine ,umsetzen möchte.
Falls euch das System nicht bekannt ist , es geht lediglich um eine Art Visuelles Scripten, wo Blöcke welche meist Funktionen repräsentieren über Eingang und Ausgang Pins verfügen und so mit weiteren Blöcken verbunden werden.
Meine Frage wäre hier wie man das am besten Grafisch umsetzen könnte. Mit GDI + bin ich mir nicht sicher ob das von der Performance her hinhaut . Ich Arbeite nebenher auch an einer aktuellen OpenCV UDF mit OpenGL Support , vielleicht gibt es aber auch bessere Lösungen.
Es geht lediglich um die Core Mechaniken , also das anzeigen der Blöcke sowie das Verbinden, das ganze ist dann natürlich nicht Statisch sondern die GUI soll dann auch Scrollbar sein.
würde mich auf die ein oder andere Idee freuen
-
Vielen dank für die Aufklärung ! Die Deklaration außerhalb der Funktion scheint das Problem schon gelöst zu haben, nun funktioniert alles problemlos mit dem Code:
Code
Alles anzeigen$hDll = DllOpen("VR_API.dll") $intptr = DllCall($hDll, "int*:cdecl", "GetMyIntegers") $struct = DllStructCreate("int[3]",$intptr[0]) $myInteger = DllStructGetData($struct, 1, 1) ConsoleWrite("1 = " & $myInteger & @LF) $myInteger = DllStructGetData($struct, 1, 2) ConsoleWrite("2 = " & $myInteger & @LF) $myInteger = DllStructGetData($struct, 1, 3) ConsoleWrite("3 = " & $myInteger & @LF)
Ist diese Methode dann so okay, oder sollte ich doch lieber eine deiner oben genanten Optionen benutzen?
-
Guten Abend,
Ich habe eine Simple DLL Funktion die einen Array zurückgibt:
Codeextern "C" __declspec(dllexport) int *GetMyIntegers() { int myIntegers[3]; myIntegers[0] = 10; myIntegers[1] = 20; myIntegers[2] = 30; return myIntegers; }
Da es sich hier um ein Array handelt ist es mit dem Rückgabewert bei einem DllCall ja nicht so einfach wie mit einem einfach int z.b... Ich habe nun schon ein paar Dinge versucht die ich so im Internet finden konnte, leider noch erfolglos.. hier mal mein aktueller Versuch:
Code
Alles anzeigen$hDll = DllOpen("VR_API.dll") $intptr = DllCall($hDll, "int*:cdecl", "GetMyIntegers") $struct = DllStructCreate("int[3]",$intptr[0]) $myInteger = DllStructGetData($struct, 1, 1) ConsoleWrite("1 = " & $myInteger & @LF) $myInteger = DllStructGetData($struct, 1, 2) ConsoleWrite("2 = " & $myInteger & @LF) $myInteger = DllStructGetData($struct, 1, 3) ConsoleWrite("3 = " & $myInteger & @LF)
OutPut der Console:
1 = 0
2 = 18183192
3 = 339
2 und 3 ändern sich aber Regelmäßig mit jedem Aufruf... So Habe ich es auch probiert , bekomme jedoch nur 0 raus:
Code
Alles anzeigen$hDll = DllOpen("VR_API.dll") $struct = DllStructCreate("int[3]") $intptr = DllCall($hDll, "int*:cdecl", "GetMyIntegers", "int", DLLStructGetPtr($struct)) $myInteger = DllStructGetData($struct, 1, 1) ConsoleWrite("1 = " & $myInteger & @LF) $myInteger = DllStructGetData($struct, 1, 2) ConsoleWrite("2 = " & $myInteger & @LF) $myInteger = DllStructGetData($struct, 1, 3) ConsoleWrite("3 = " & $myInteger & @LF)
Würde mich sehr über Hilfe Freuen
-
Ja es funktioniert jetzt tatsächlich !
vielen dank , das hat mir sehr viel weitergeholfen!
-
Der DllCall Fehlercode also "00F5801A0" ist der Rückgabewert der Funktion , es ist eine selbstkompilierte 32 Bit DLL.. Ich scheine nun auch zum ersten mal das Script ausführen zu können ohne einen Absturz, es sieht nicht groß anders aus:
Code$hDll = DllOpen("Dll6.dll") ConsoleWrite("DllOpen Handle = " & $hDll) $aReturn1 = DllCall($hDLL, "ptr:cdecl", "init_OpenVR") ConsoleWrite("init_OpenVr - @error=" & @error) $aReturn2 = DllCall($hDLL, "none:cdecl", "ProcessVREvents", "ptr", $aReturn1[0]) ConsoleWRite("ProcessVREvents - @error=" & @error)
Ich habe in der DLL Funktion "ProcessVREvents" ja einen cout von dem Parameter, dieser zeigt er mir nun auch in der AutoIt Console an
-
-
Alles klar, nun danke für das hinweisen
Die Dokumentation von OpenVR : https://github.com/ValveSoftware/…I-Documentation
Hier mal meine DLL:
C
Alles anzeigen#include <iostream> #include <Windows.h> #include <openvr.h> #include "Utils.h" using namespace std; vr::IVRSystem* vr_context; // VR Init extern "C" __declspec(dllexport) vr::IVRSystem* init_OpenVR() { vr::HmdError err; vr_context = vr::VR_Init(&err, vr::EVRApplicationType::VRApplication_Background); return vr_context; } // Versuche zu callen mit dem Rückgabewert von VR Init extern "C" __declspec(dllexport) void ProcessVREvents(vr::IVRSystem* Placeholder) { cout << Placeholder << endl; }
Autoit:
;Hier der Call für die erste Funktion / Funktioniert auch Problemlos / Rückgabe sollte hier passen
$aReturn = DllCall($hDLL, "ptr", "init_OpenVR")
;Hier nun der einfache Versuch die zweite Funktion zu callen mit Rückgabewert von oben als Parameter
DllCall($hDLL, "NONE", "ProcessVREvents", "ptr", $aReturn[0])
Resultat: Autoit stürzt ab : "Autoit v3 Script funktioniert nicht mehr"
Freue mich auf jeglicher Art von Hilfe
-
Guten Abend,
Ich bin nun schon etwas an einer Sache dran und würde mich sehr freuen wenn jemand mir "die Augen öffnen könnte"..
Ich möchte eine eine DLL schreiben um mit OpenVR zu kommunizieren.
Wem OpenVR nichts sagt: mithilfe von OpenVR lässt sich z.b. die Position der Controller bzw des VR Headsets auslesen.
Nun möchte ich die Funktionen in einer DLL zusammenfassen und mit AutoIt callen, das funktioniert auch soweit.
Das erste was man callen muss um weitere Funktionen der DLL nutzen zu können ist ein sogenannter : "VR_Init" ,
VR_Init gibt ein Pointer zurück der benötigt wird um alle weiteren Funktionen nutzen zu können.
Das heißt wenn ich jetzt in Autoit den ersten DLL Call mache, also: "VR_Init", dann bekomme ich den Pointer als Rückgabewert.
Nun möchte ich eine weitere Function callen die diesen Pointer benötigt, also mache ich wieder einen DLL Call und gebe als Paramter den Pointer mit,.
Nun das Problem: Autoit stürzt jedes mal ab, sobald ich eine entsprechende Funktion Calle, also eine Funktion die diesen Pointer als Parameter benötigt.
Das Problem liegt wahrscheinlich daran das der Pointer auf eine Class zeigt, und Autoit mit dem Typ nichts anfangen kann oder?
Würde mich sehr über eine Antwort freuen