@Mattthias: Ich bin sicher du findest es heraus. ![]()
Beiträge von funkey
-
-
Dann hätte ich GUICtrlCreateContextMenu() verwendet, aber es geht natürlich auch so.
-
Wieso verwendest du die UDF und nicht die internen Funktionen?
Mit GUICtrlCreateMenu und GUICtrlCreateMenuItem ist das kein Problem und das Hilfebeispiel zeigt wie es geht. -
Kennst du die Befehle 'Asc()' und 'Chr()' schon?
Das Hex-A hat mit dem ASCII-A nichts zu tun! -
Zu langsam bedeutet, dass wenn ich 20 Amperemeter habe, dass mind. 200ms dauert. Und dass war mir einfach zu langsam.
Der originale AutoIt-Code, denn ich verwendet habe, kommt deinem Visualizer ziemlich nahe, hab das damals nämlich für meine Zwecke umgebaut.
Ich hoffe du hast da nichts dagegen (auch wenn's schon zu spät ist), aber dafür bekommst du ja auch wieder etwas zurück.
Ich habe mir C/C++ erst vor kurzem über eine PDF selbst beigebracht. Ich finde es immer leichter, je länger und öfter ich das mache.
Langsam Schritt für Schritt entferne ich die Bremsen aus meinen AutoIt-Skripten und ersetze diese mit DLLs oder Exe-Dateien. -
Ich hatte bisher immer die Amperemeter für einige meiner Programme rein mittels AutoIt und der GDIPlus-UDF gezeichnet, das war mir aber zu langsam, deshalb habe ich beschlossen das ganze in eine DLL auszulagern und es lief wie erwartet bedeutend schneller.
Ich habe 2 Arten von Amperemetern erstellt, einmal zeichne ich direkt auf die Gui, das zweite Mal erstelle ich ein Pic-Control und setze dort das Bitmap. Das zweite hat den Vorteil, das man sich um nichts zu kümmern braucht, was das Neuzeichnen angeht, wenn ein Fenster drübergeschoben wird, allerdings flackert es, wenn man es zu oft updatet.
Das erste kann man so oft wie nur irgendmöglich updaten und es flackert dank Backbuffer nicht.Ich hoffe es kann jemand brauchen, darum teile ich es nun mit euch. C++-Source und AutoIt-Beispiel ist dabei.
-
Die Methode mittels CBTHook ist die beste! Die andere Variante funktioniert leider nicht immer.
Hier ein Beispiel aus meiner FunSkin-UDF:
Spoiler anzeigen
[autoit]#include <WinAPI.au3>
[/autoit] [autoit][/autoit] [autoit]Local $hProcMsgBox = DllCallbackRegister("CbtHookProcMsgBox", "int", "int;int;int")
[/autoit] [autoit][/autoit] [autoit]
Local $TIDMsgBox = _WinAPI_GetCurrentThreadId()
Local $hHookMsgBox = _WinAPI_SetWindowsHookEx($WH_CBT, DllCallbackGetPtr($hProcMsgBox), 0, $TIDMsgBox)Local $iRet = MsgBox(34, "Select example", "Please select the skin you want to try")
[/autoit] [autoit][/autoit] [autoit]_WinAPI_UnhookWindowsHookEx($hHookMsgBox)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
DllCallbackFree($hProcMsgBox)#region Just for fun!!
[/autoit] [autoit][/autoit] [autoit]
;##########################################################
Func CbtHookProcMsgBox($nCode, $wParam, $lParam)
Local $RET = 0, $hBitmap = 0, $xWnd = 0
If $nCode < 0 Then
$RET = _WinAPI_CallNextHookEx($hHookMsgBox, $nCode, $wParam, $lParam)
Return $RET
EndIf
Switch $nCode
Case 5 ;5=HCBT_ACTIVATE
_WinAPI_SetDlgItemText($wParam, 3, "1")
_WinAPI_SetDlgItemText($wParam, 4, "2")
_WinAPI_SetDlgItemText($wParam, 5, "3")
EndSwitch
Return
EndFunc ;==>CbtHookProcMsgBoxFunc _WinAPI_SetDlgItemText($hDlg, $nIDDlgItem, $lpString)
[/autoit] [autoit][/autoit] [autoit]
Local $aRet = DllCall('user32.dll', "int", "SetDlgItemText", _
"hwnd", $hDlg, _
"int", $nIDDlgItem, _
"str", $lpString)
Return $aRet[0]
EndFunc ;==>_WinAPI_SetDlgItemText;##########################################################
[/autoit]
#endregion Just for fun!! -
Nehmt doch die Fensterklasse: SciTEWindow
-
Das war auch nicht mein erster Versuch, die anderen Skripte stürzten auch immer ab.
-
Hab mal ein Beispiel gemacht, wie man eine richtige MDI-Applikation mit AutoIt erstellen kann.
Es ist zwar noch kein fertiges Programm und ich glaube es enthält irgendwo noch Fehler, aber damit kann man schon was anfangen.Viel Spaß!
Spoiler anzeigen
[autoit]#cs
[/autoit] [autoit][/autoit] [autoit]
Multiple Document Interface example in AutoIt
Author: funkey
Date: 2011, 23rd of September
#ce#include <WinAPIEx.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiMenu.au3>
#include <GuiEdit.au3>Opt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]Global Const $IDC_ARROW = 32512
[/autoit] [autoit][/autoit] [autoit]
Global Const $tagCLIENTCREATESTRUCT = "HANDLE hWindowMenu;UINT idFirstChild"
Global Const $tagMDICREATESTRUCT = "ptr szClass;ptr szTitle;HANDLE hOwner;int x;int y;int cx;int cy;DWORD style;LPARAM lParam"Global Const $CW_USEDEFAULT = 0x80000000
[/autoit] [autoit][/autoit] [autoit]
Global Const $IDM_FIRSTCHILD = 50000
Global Const $WM_MDIGETACTIVE = 553
Global Const $WM_MDICREATE = 544
Global Const $WM_MDIACTIVATE = 546
Global Const $WM_MDITILE = 550
Global Const $WM_MDICASCADE = 551
Global Const $MF_ENABLED = 0Global $hInstance = _WinAPI_GetModuleHandle(0)
[/autoit] [autoit][/autoit] [autoit]
Global $hProcChild = DllCallbackRegister('_WndProcChild', 'lresult', 'hwnd;uint;wparam;lparam')
Global $hCursor = _WinAPI_LoadCursor(0, $IDC_ARROW)
Global $tIcon = DllStructCreate('ptr;ptr')
_WinAPI_ExtractIconEx(@SystemDir & '\shell32.dll', 130, DllStructGetPtr($tIcon, 1), DllStructGetPtr($tIcon, 2), 1)
Global $hIcon = DllStructGetData($tIcon, 1)
Global $hIconSm = DllStructGetData($tIcon, 2)If _MDI_RegisterChildClass() = 0 Then
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite("Error Registering WindowClass!" & @CRLF)
Exit
EndIfGlobal $hGui = GUICreate("AutoIt MDI-Example by funkey", -1, -1, -1, -1, BitOR($WS_MAXIMIZE, $GUI_SS_DEFAULT_GUI))
[/autoit] [autoit][/autoit] [autoit]
GUISetOnEvent(-3, "_Exit", $hGui)
GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")Global $filemenu = GUICtrlCreateMenu("&File")
[/autoit] [autoit][/autoit] [autoit]
Global $file_new = GUICtrlCreateMenuItem("&New Child", $filemenu)
GUICtrlSetOnEvent(-1, "_NewMDIChild")
Global $file_close = GUICtrlCreateMenuItem("E&xit", $filemenu)
GUICtrlSetOnEvent(-1, "_Exit")Global $windowmenu = GUICtrlCreateMenu("&Window")
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Global $window_tileH = GUICtrlCreateMenuItem("Tile &horizontal", $windowmenu)
GUICtrlSetOnEvent(-1, "_TileH")
Global $window_tileV = GUICtrlCreateMenuItem("Tile &vertical", $windowmenu)
GUICtrlSetOnEvent(-1, "_TileV")
Global $window_cascade = GUICtrlCreateMenuItem("&Cascade", $windowmenu)
GUICtrlSetOnEvent(-1, "_Cascade")Global $hClient = _MDI_CreateClient($hGui)
[/autoit] [autoit][/autoit] [autoit]GUISetState(@SW_SHOW, $hGui)
[/autoit] [autoit][/autoit] [autoit]Global $hChild = _MDI_CreateChild($hClient, "Untitled 0", "MDIChild")
[/autoit] [autoit][/autoit] [autoit]
_CreateEditOnMDI($hChild)While 1
[/autoit] [autoit][/autoit] [autoit]
Sleep(20000)
WEndFunc _TileH()
[/autoit] [autoit][/autoit] [autoit]
_SendMessage($hClient, $WM_MDITILE, 1, 0);
EndFunc ;==>_TileHFunc _TileV()
[/autoit] [autoit][/autoit] [autoit]
_SendMessage($hClient, $WM_MDITILE, 0, 0);
EndFunc ;==>_TileVFunc _Cascade()
[/autoit] [autoit][/autoit] [autoit]
_SendMessage($hClient, $WM_MDICASCADE, 0, 0);
EndFunc ;==>_CascadeFunc _NewMDIChild()
[/autoit] [autoit][/autoit] [autoit]
Static $i = 0
$i += 1
_CreateEditOnMDI(_MDI_CreateChild($hClient, "Untitled " & $i, "MDIChild"))
EndFunc ;==>_NewMDIChildFunc _CreateEditOnMDI($hChild)
[/autoit] [autoit][/autoit] [autoit]
Local $aPos = WinGetClientSize($hChild)
_GUICtrlEdit_Create($hChild, "", 5, 5, $aPos[0] - 10, $aPos[1] - 10, BitOR($ES_MULTILINE, $ES_WANTRETURN, $ES_AUTOVSCROLL))
EndFunc ;==>_CreateEditOnMDIFunc _Exit()
[/autoit] [autoit][/autoit] [autoit]
_WinAPI_UnregisterClass('MDIChild')
GUIDelete($hGui)
Exit
EndFunc ;==>_ExitFunc _WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
Local $nNotifyCode = BitShift($wParam, 16)
Local $hChildMDI
If $nNotifyCode >= $IDM_FIRSTCHILD Then
_WinAPI_DefFrameProc($hWnd, $hClient, $WM_COMMAND, $wParam, $lParam)
Else
$hChildMDI = _SendMessage($hClient, $WM_MDIGETACTIVE, 0, 0, 0, "wparam", "lparam", "hwnd")
If $hChildMDI Then
_SendMessage($hChildMDI, $WM_COMMAND, $wParam, $lParam)
EndIf
EndIf
_WinAPI_DefFrameProc($hWnd, $hClient, $WM_COMMAND, $wParam, $lParam)
EndFunc ;==>_WM_COMMANDFunc _MDI_RegisterChildClass()
[/autoit] [autoit][/autoit] [autoit]
Local $sClass = 'MDIChild'
Local $tClass = DllStructCreate('wchar[' & StringLen($sClass) + 1 & ']')
DllStructSetData($tClass, 1, $sClass)Local $tWCEX = DllStructCreate($tagWNDCLASSEX)
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($tWCEX, 'Size', DllStructGetSize($tWCEX))
DllStructSetData($tWCEX, 'Style', 3)
DllStructSetData($tWCEX, 'hWndProc', DllCallbackGetPtr($hProcChild))
DllStructSetData($tWCEX, 'ClsExtra', 0)
DllStructSetData($tWCEX, 'WndExtra', 0)
DllStructSetData($tWCEX, 'hInstance', $hInstance)
DllStructSetData($tWCEX, 'hIcon', $hIcon)
DllStructSetData($tWCEX, 'hCursor', $hCursor)
DllStructSetData($tWCEX, 'hBackground', 1);_WinAPI_CreateSolidBrush(_WinAPI_GetSysColor($COLOR_3DFACE)))
DllStructSetData($tWCEX, 'MenuName', 0)
DllStructSetData($tWCEX, 'ClassName', DllStructGetPtr($tClass))
DllStructSetData($tWCEX, 'hIconSm', $hIconSm)
;~ DllStructSetData($tWCEX, 'hIconSm', 0)Return _WinAPI_RegisterClassEx($tWCEX)
[/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>_MDI_RegisterChildClassFunc _MDI_CreateClient($hMDIParent)
[/autoit] [autoit][/autoit] [autoit]
Local $aClientSize = WinGetClientSize($hGui)
Local $iMenuHeight = _WinAPI_GetSystemMetrics(15)
Local $tCLIENTCREATESTRUCT = DllStructCreate($tagCLIENTCREATESTRUCT)
DllStructSetData($tCLIENTCREATESTRUCT, "hWindowMenu", _GUICtrlMenu_GetItemSubMenu(_GUICtrlMenu_GetMenu($hGui), 1))
DllStructSetData($tCLIENTCREATESTRUCT, "idFirstChild", $IDM_FIRSTCHILD)Local $hMDIClient = _WinAPI_CreateWindowEx( _
[/autoit] [autoit][/autoit] [autoit]
0, "MDICLIENT", "", 0x52000000, _ ; Fensterstile (WS_CLIPCHILDREN|WS_CHILD|WS_VISIBLE)
0, 0, $aClientSize[0], $aClientSize[1] - $iMenuHeight, _ ; Position und Grösse des Fensters
$hMDIParent, 0, $hInstance, _
DllStructGetPtr($tCLIENTCREATESTRUCT))
Return $hMDIClient
EndFunc ;==>_MDI_CreateClientFunc _MDI_CreateChild($hMDIClient, $sTitle, $sClassName)
[/autoit] [autoit][/autoit] [autoit]
Local $tClass = DllStructCreate('wchar[' & StringLen($sClassName) + 1 & ']')
DllStructSetData($tClass, 1, $sClassName)
Local $tTitle = DllStructCreate('wchar[' & StringLen($sTitle) + 1 & ']')
DllStructSetData($tTitle, 1, $sTitle)Local $tMDICREATESTRUCT = DllStructCreate($tagMDICREATESTRUCT)
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($tMDICREATESTRUCT, 'szClass', DllStructGetPtr($tClass))
DllStructSetData($tMDICREATESTRUCT, "szTitle", DllStructGetPtr($tTitle))
DllStructSetData($tMDICREATESTRUCT, "hOwner", $hInstance)
DllStructSetData($tMDICREATESTRUCT, "x", $CW_USEDEFAULT)
DllStructSetData($tMDICREATESTRUCT, "y", $CW_USEDEFAULT)
DllStructSetData($tMDICREATESTRUCT, "cx", $CW_USEDEFAULT)
DllStructSetData($tMDICREATESTRUCT, "cy", $CW_USEDEFAULT)
DllStructSetData($tMDICREATESTRUCT, "style", 0)
DllStructSetData($tMDICREATESTRUCT, "lParam", 0)Local $hRet = _SendMessage($hMDIClient, $WM_MDICREATE, 0, DllStructGetPtr($tMDICREATESTRUCT), 0, "wparam", "lparam", "hwnd")
[/autoit] [autoit][/autoit] [autoit]
Return $hRet
EndFunc ;==>_MDI_CreateChildFunc _WndProcChild($hWnd, $iMsg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
Switch $iMsg
Case $WM_MDIACTIVATE
Local $hMenu = _GUICtrlMenu_GetMenu($hGui)
If $hWnd = HWnd($lParam) Then
_GUICtrlMenu_EnableMenuItem($hMenu, 1, BitOR($MF_BYPOSITION, $MF_ENABLED))
Else
_GUICtrlMenu_EnableMenuItem($hMenu, 1, BitOR($MF_BYPOSITION, $MF_GRAYED))
EndIf
_GUICtrlMenu_DrawMenuBar($hGui)
EndSwitch
Return _WinAPI_DefMDIChildProc($hWnd, $iMsg, $wParam, $lParam)
EndFunc ;==>_WndProcChildFunc _WinAPI_DefMDIChildProc($hWnd, $iMsg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
Local $Ret = DllCall('user32.dll', 'lresult', 'DefMDIChildProcW', 'hwnd', $hWnd, 'uint', $iMsg, 'wparam', $wParam, 'lparam', $lParam)
If @error Then Return SetError(1, 0, 0)
Return $Ret[0]
EndFunc ;==>_WinAPI_DefMDIChildProcFunc _WinAPI_DefFrameProc($hWnd, $hWndMDIClient, $iMsg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit][/autoit]
Local $Ret = DllCall('user32.dll', 'lresult', 'DefFrameProcW', 'hwnd', $hWnd, 'hwnd', $hWndMDIClient, 'uint', $iMsg, 'wparam', $wParam, 'lparam', $lParam)
If @error Then Return SetError(1, 0, 0)
Return $Ret[0]
EndFunc ;==>_WinAPI_DefFrameProc -
Wie hier zu lesen ist, kann der Schließen-Button mit dem Style CS_NOCLOSE (512) deaktiviert werden. Aber nur beim Registrieren der Klasse. Da dies aber AutoIt-intern passiert und man darauf keinen Einfluss hat, kann das nur noch über den DLLCall nachgeholt werden.
Natürlich kann man mit _WinAPI_RegisterClassEx und _WinAPI_CreateWindowEx seine eigenen Fenster bauen, abr das wären ja schon wieder so unnötige DLLCalls.
Ob nun AutoIt intern die DLLs ausführt oder sie explizit über das Skript aufgerufen werden, was soll's!Edit: Jetzt mal davon abgesehen, dass es sich hierbei wieder um DLLCalls handelt, hier noch ein Beispiel wie man den Style der Klasse ändern kann. Wie man daraus ableiten kann, wird damit aber jedes Fenster mit der gleichen Fensterklasse beeinflusst, und das will man ja in der Regel auch nicht!
Spoiler anzeigen
[autoit]#include <GUIConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#Include <WinAPIEx.au3>Global Const $GCL_STYLE = -26
[/autoit] [autoit][/autoit] [autoit]
Global Const $CS_NOCLOSE = 512$GUI = GUICreate("Beispiel", 250, 150, 10, 10)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
GUISetState()
_WinAPI_SetClassLongEx($GUI, $GCL_STYLE, BitOR(_WinAPI_GetClassLongEx($GUI, $GCL_STYLE), $CS_NOCLOSE))Sleep(2000)
[/autoit] [autoit][/autoit] [autoit]
$GUI2 = GUICreate("Beispiel2", 250, 150, 500, 500)
GUISetState()While 1
[/autoit]
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
Exit
EndSelect
WEnd -
OCR und 100% zuverlässig, na ja das wird wohl nichts.
Du kannst aber mal das probieren. Da sind 2 Programme verlinkt, die vielleicht bessere Ergebnisse liefern. -
Wie hast du dir das mit der Hardware vorgestellt?
-
Sollte dann eigentlich funktionieren.
Gibt es möglicherweise ein zweites Fenster mit dem selben Namen?
Ansonsten weiß ich nur den Rat, den Fenstertext (2.Parameter) mitanzugeben. -
Hey, alles Gute zum Dreißiger!! Bleib gesund!!
[Blockierte Grafik: http://grusskarten.m-mdesign.org/files/2010/09/mm1021.jpg] -
Du hast recht, eine Static Global Variable sollte überall im Skript sichtbar sein. Nur ist für mich Static und Global gleichzeitig total sinnlos, und erst recht so wie du sie verwendest, nämlich nicht zum einmaligen initialisieren.
-
Wofür / für welches Programm wird das gebraucht?
Vllt gibt es einen besseren Weg.
Die Forenreglen hast du ja gelesen, oder? -
[autoit]
$var1 = "10.245.55"
[/autoit][autoit][/autoit][autoit]
$var2 = "945.33"ConsoleWrite(Ersetze2tenPunkt($var1) & @CR)
[/autoit][autoit][/autoit][autoit]
ConsoleWrite(Ersetze2tenPunkt($var2) & @CR)Func Ersetze2tenPunkt($string)
[/autoit][autoit][/autoit][autoit][/autoit]
Local $sRet = $string
Local $Pos = StringInStr($string, ".", 0, 2)
If $Pos <> 0 Then
$sRet = StringReplace($sRet, Int($Pos), " ")
$sRet = StringReplace($sRet, " ", "")
EndIf
Return $sRet
EndFunc -
Habe auch schon öfter gesucht und nichts gefunden.
Das wäre auch für mich nützlich. -
Was funktioniert nicht??
Ich sehe jetzt auf die Schnelle keinen groben Fehler mehr, aber ich würde FileOpen und FileClose komplett entfernen, _FileCountLines mehr oder weniger durch _FileReadToArray ersetzten und die Playlist in einem Rutsch einlesen. Außerdem sollten für deinen Anwendungsfall das interne 'SoundPlay()' ausreichen, du brauchst also die Sound-UDF nicht, dafür musst du natürlich die "File.au3" includen! <-- Sehe gerade, dass das der Fehler sein könnte den du meinst.