zero0147 Posted September 11, 2022 Share Posted September 11, 2022 I want to modify it to search only on the emulator. what do i need to fix Usually captures both the screen. ; #UDF# ============================================== ================================================= ====================== ; ชื่อ ..........: OpenCV Match UDF ; คำอธิบาย ...: จับคู่รูปภาพบนหน้าจอเพื่อดำเนินการอัตโนมัติอย่างง่าย ; รุ่น .......: v1.0 ; ผู้แต่ง ........: BB_19 ; เครดิต ........: @mylise ; ================================================= ================================================= ============================ #include-once #include <GDIplus.au3> #include <ScreenCapture.au3> Global $OpenCV_MatchLogging = False , $OpenCV_ErrorLogging = False, $OpenCV_AutoitConsoleLogging = False Global $_opencv_core, $_opencv_highgui, $_opencv_imgprocGlobal $handle = WinGetHandle("NoxPlayer") _GDIPlus_Startup() ; #FUNCTION# =============================================== ================================================= =================== ; ชื่อ ..........: _ClickMouse ; คำอธิบาย ...: คำนวณจุดศูนย์กลางของสี่เหลี่ยมจัตุรัสโดยใช้อาร์เรย์ที่มีพิกัด จากนั้นคลิกปุ่มซ้าย/ขวาของเมาส์ ; ไวยากรณ์ ........: _ClickMouse($Coordinates, $mouse_button[, $number_of_clicks = 1]) ; พารามิเตอร์ ....: $Coordinates - Array ส่งคืนโดย _MatchPicture ; $mouse_button - [ตัวเลือก] สตริง "ซ้ายขวา". ค่าเริ่มต้นคือ "ซ้าย" ; $number_of_clicks - [ตัวเลือก] ค่าตัวเลขทั่วไป ค่าเริ่มต้นคือ 1; ================================================= ================================================= ============================ Func _ClickMouse($Coordinates, $mouse_button="left", $number_of_clicks = 1) MouseUp("") BlockInput(1) MouseClick($mouse_button, ($Coordinates[0] + $Coordinates[2]) / 2, ($Coordinates[1] + $Coordinates[3]) / 2, $number_of_clicks, 0) BlockInput(0) บล็อกอินพุท(1) EndFunc ;==>_ClickMouse ; #FUNCTION# =============================================== ================================================= =================== ; ชื่อ ..........: _MatchPicture ; คำอธิบาย ...: ค้นหารูปภาพบนหน้าจอหรือบนพื้นที่เฉพาะของหน้าจอและส่งคืนพิกัดที่พบรูปภาพนั้น ; ไวยากรณ์ ........: _MatchPicture($Match_Pic[, $Threshold = 0.9[, $CustomCords = False[, $LoopCount = 1[, $LoopWait = 2000]]]) ; Parameters ....: $Match_Pic - พาธไปยังรูปภาพที่จะจับคู่ ; $Threshold - [ตัวเลือก] เกณฑ์ 0.1-1.0 ยิ่งสูง ยิ่งต้องจับคู่ภาพให้แม่นยำมากขึ้นเท่านั้นจึงจะเข้าคู่กันได้ ค่าเริ่มต้นคือ 0.9; $CustomCords - [ตัวเลือก] อาร์เรย์ที่มีพิกัดสำหรับ rect x1,y1,x2,y2 ที่สามารถใช้ในการค้นหาในพื้นที่เฉพาะของหน้าจอ สามารถสร้างได้โดยใช้ Snapshot-Tool ที่ให้มา ค่าเริ่มต้นเป็นเท็จ ; $LoopCount - [ตัวเลือก] จำนวนครั้งที่สคริปต์จะตรวจสอบอีกครั้งว่าสามารถพบรูปภาพที่ตรงกันบนหน้าจอหรือไม่ ค่าเริ่มต้นคือ 1 ; $LoopWait - [ตัวเลือก] เวลารอในหน่วยมิลลิวินาทีระหว่างการลองแต่ละครั้ง ค่าเริ่มต้นคือ 2000 มิลลิวินาที ; ส่งคืนค่า .: อาร์เรย์ที่มีพิกัด (x1,y1,x2,y2) ของการจับคู่หรือ @error หากไม่พบรายการที่ตรงกัน ; ผู้แต่ง ........: BB_19 ; ที่เกี่ยวข้อง .......: https://www.autoitscript.com/forum/topic/160732-opencv-udf/ ; เครดิต .....: @mylise; ================================================= ================================================= ============================ Func _MatchPicture($Match_Pic, $Threshold = 0.9, $CustomCords = False, $LoopCount = 1, $LoopWait = 2000) ถ้าไม่ใช่ FileExists($Match_Pic) แล้ว _Internal_ErrorLogger("ไม่พบรูปภาพที่ตรงกัน: " & $Match_Pic) ส่งคืน SetError(1) EndIf หาก $LoopCount <= 0 แล้ว ConsoleWrite("ข้อผิดพลาด: $LoopCount Variable ตั้งค่าเป็น 0 ที่ ต้องการอย่างน้อย 1 รายการ") ส่งคืน SetError(1) EndIf Local $hBitmap ;ตัวนับประสิทธิภาพ Local $Perf = TimerInit() ;โหลดการจับคู่รูปภาพ ในเครื่อง $hMatch_Pic = _cvLoadImage($Match_Pic) Local $hMatch_Size = _cvGetSize($hMatch_Pic) Local $width2 = DllStructGetData($hMatch_Size $he2Struct Local ) ($hMatch_Size, "height") ในเครื่อง $ScreenSize = _ScreenSize() สำหรับ $iTries = 1 ถึง $LoopCount Step +1 ;Capature Screen / Load as Main image ถ้าไม่ IsArray($CustomCords) แล้ว $hBitmap = _ScreenCapture_Capture("", 0, 0, $ScreenSize[0], $ScreenSize[1], False) อื่น ๆ $hBitmap = _ScreenCapture_Capture("", $CustomCords[0], $CustomCords[1], $CustomCords[ 2], $CustomCords[3], เท็จ) EndIf Local $Bitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap) Local $hMain_Pic = _Opencv_BMP2IPL($Bitmap) Local $hMain_Size = _cvGetSize($hMain_Pic) Local $width = DllStructGetData($hMain_Size, "width") Local $ height = DllStructGetData($hMain_Size $ Local " - $width2 + 1 Local $rh = $height - $height2 + 1 Local $tmaxloc = DllStructCreate( "int x;" & "int y;") Local $tminloc = DllStructCreate( "int x;" & "int y; ") Local $tmaxval = DllStructCreate("double max;") $tminval ท้องถิ่น = DllStructCreate("double min;") ท้องถิ่น $pmaxloc = DllStructGetPtr($tmaxloc) ท้องถิ่น $pminloc = DllStructGetPtr($tminloc) ท้องถิ่น $pmaxval = DllStructGetPtr($tmaxval) ท้องถิ่น $pminval = DllStructGetPtr($tminval) ;ค้นหาการจับคู่ ในพื้นที่ $presult = _cvCreateMat($rh, $rw, 5) _cvMatchTemplate($hMain_Pic, $hMatch_Pic, $presult, 5) _cvThreshold($presult, $presult, $Threshold, 1, 0) _cvpresultMaxLoc , $pminval, $pmaxval, $pminloc, $pmaxloc, Null) ;ตั้งค่าพิกัด ท้องถิ่น $Coordinates[4] ถ้า IsArray($CustomCords) จากนั้น $Coordinates[0] = DllStructGetData($tmaxloc, "x") + $CustomCords[0] ; x $Coordinates[1] = DllStructGetData($tmaxloc, "y") + $CustomCords[1] ; y $Coordinates[2] = DllStructGetData($tmaxloc, "x") + $width2 + $CustomCords[0] ;x2 $Coordinates[3] = DllStructGetData($tmaxloc, "y") + $height2 + $CustomCords[1] พิกัด ] ;y2 อื่น ๆ $Coordinates[0] = DllStructGetData($tmaxloc, "x"); x $Coordinates[1] = DllStructGetData($tmaxloc, "y"); y $พิกัด[2] = DllStructGetData($tmaxloc, "x") + $width2 ;x2 $พิกัด[3] = DllStructGetData($tmaxloc, "y") + $height2 ;y2 EndIf ;ปล่อยทรัพยากร _cvReleaseMat($presult) _cvReleaseImage($hMain_Pic) _GDIPlus_BitmapDispose($Bitmap) _WinAPI_DeleteObject($hBitmap) ตรวจสอบว่าพบ หรือไม่ ถ้าไม่พบ (DllStructGetData($tmaxloc, "x") = 0 และ DllStructGetData($tmaxloc, "y") = 0 And $width2 = DllStructGetData($tmaxloc, "x") + $width2 And $height2 = DllStructGetData($tmaxloc, "y") + $height2) จากนั้น _cvReleaseImage($hMatch_Pic) _Internal_MatchLogger("พบการจับคู่ที่: " & $Coordinates[0] & "|" & $Coordinates[1] & "|" & $Coordinates [2] & "|" & $Coordinates[3] & " // ตัวนับลูป: " & $iTries & " // เกณฑ์: " & $Threshold & " // เวลาตรวจสอบทั้งหมด: " & Round(TimerDiff($Perf) ), 0) & "มิลลิวินาที") ส่งคืนพิกัด $ EndIf Sleep($LoopWait) ถัดไป _cvReleaseImage($hMatch_Pic) _Internal_ErrorLogger("ไม่พบรายการที่ตรงกัน ตัวนับลูป: " & $LoopCount & ". // เวลาตรวจสอบทั้งหมด: " & Round(TimerDiff($Perf), 0) & " ms // เวลารอต่อลูป: " & $LoopWait & " ms. // Threshold: " & $Threshold & " // Match Image: " & $Match_Pic) Return SetError(2) EndFunc ;==>_MatchPicture ; #FUNCTION# =============================================== ================================================= =================== ; ชื่อ ..........: _OpenCV_EnableLogging ; คำอธิบาย ...: เปิดใช้งานการบันทึกการแข่งขันและข้อผิดพลาดในไฟล์และคอนโซล ; ไวยากรณ์ ........: _OpenCV_EnableLogging([$MatchLogging = True[, $ErrorLogging = False[, $AutoitConsoleLogging = False]]) ; พารามิเตอร์ ....: $MatchLogging - [ทางเลือก] บันทึกการแข่งขันทั้งหมดในไฟล์ที่มีพิกัดและรายละเอียดอื่นๆ ค่าเริ่มต้นคือ จริง ; $ErrorLogging - [ตัวเลือก] บันทึกข้อผิดพลาดทั้งหมดรวมถึงการจับคู่ที่ล้มเหลวในไฟล์ ค่าเริ่มต้นเป็นเท็จ; $AutoitConsoleLogging - [ตัวเลือก] แสดงผลการแข่งขัน ข้อผิดพลาด และการจับคู่ที่ล้มเหลวทั้งหมดบนคอนโซล Autoit ค่าเริ่มต้นเป็นเท็จ ; ================================================= ================================================= ============================ Func _OpenCV_EnableLogging($MatchLogging = True, $ErrorLogging = False, $AutoitConsoleLogging = False) $OpenCV_MatchLogging = $MatchLogging $OpenCV_ErrorLogging = $ErrorLogging $OpenCV_AutoitConsoleLogging = $AutoitConsoleLogging EndFunc ;==>_OpenCV_EnableLogging ; #FUNCTION# =============================================== ================================================= =================== ; ชื่อ ..........: _MarkMatch ; คำอธิบาย ...: วาดเส้นตรงที่ตำแหน่งของการแข่งขันเพื่อระบุตำแหน่งที่พบการแข่งขันบนหน้าจอ ; ไวยากรณ์ ........: _MarkMatch($พิกัด[, $iColor = 0x0000FF]) ; พารามิเตอร์ ....: $Coordinates - Array ส่งคืนโดย _MatchPicture ; $iColor - [ตัวเลือก] ค่าจำนวนเต็ม ค่าเริ่มต้นคือ 0x0000FF ; หมายเหตุ ................: เครื่องหมายไม่สามารถมองเห็นได้เป็นเวลานาน ; ผู้แต่ง ........: มัลกี้; แก้ไขแล้ว .....: BB_19; ================================================= ================================================= ============================ Func _MarkMatch($Coordinates, $iColor = 0x0000FF) Local $start_x = $Coordinates[0], $start_y = $Coordinates[1], $iWidth = $Coordinates[2], $iHeight = $Coordinates[3] ในพื้นที่ $hDC = _WinAPI_GetWindowDC(0) ; DC ของหน้าจอทั้งหมด (เดสก์ท็อป) Local $tRect = DllStructCreate($tagRECT) DllStructSetData($tRect, 1, $start_x) DllStructSetData($tRect, 2, $start_y) DllStructSetData($tRect, 3, $iWidth) Dll$tRctData , 4, $iHeight) $hBrush ในพื้นที่ = _WinAPI_CreateSolidBrush($iColor) _WinAPI_FrameRect($hDC, DllStructGetPtr($tRect), $hBrush) _WinAPI_DeleteObject($hBrush) _WinAPI_ReleaseDC(0, $ hDC) EndFunc ;==>_MarkMatch ; #FUNCTION# =============================================== ================================================= =================== ; ชื่อ ..........: _ScreenSize ; คำอธิบาย ...: ส่งคืนค่าความกว้าง + ความสูงทั้งหมดที่จำเป็นในการสร้างสแน็ปช็อตของจอแสดงผลทั้งหมดในคราวเดียว ; ไวยากรณ์ ........: _ScreenSize() ; ส่งกลับค่า .: Array ด้วย [0]=Width, [1]=Height ; ผู้แต่ง ........: BB_19 ; ================================================= ================================================= ============================ Func _ScreenSize() ;คืนค่าความกว้าง+ความสูงของจอภาพทั้งหมด ในพื้นที่ $MonSizePos[2], $MonNumb = 1 $MonSizePos[0] = @DesktopWidth $MonSizePos[1] = @DesktopHeight ;รับจอภาพ Local $aPos, $MonList = _WinAPI_EnumDisplayMonitors() ถ้า @error จากนั้นคืนค่า $MonSizePos หาก IsArray($MonList) จากนั้น ReDim $MonList[$MonList[0][0] + 1][5] สำหรับ $i = 1 ถึง $MonList [0][0] $aPos = _WinAPI_GetPosFromRect($MonList[$i][1]) สำหรับ $j = 0 ถึง 3 $MonList[$i][$j + 1] = $aPos[$j] Next Local $ width = $MonList[$i][1] + $MonList[$i][3] Local $height = ($MonList[$i][2] + $MonList[$i][4]) ถ้า $MonSizePos[ 0] < ($width) จากนั้น $MonSizePos[0] = $width ถ้า $MonSizePos[1] < ($height) จากนั้น $MonSizePos[1] = $height Next EndIf ส่งคืน $MonSizePos EndFunc ;==>_ScreenSize Func _Internal_MatchLogger($Message) Local $Timestamp = @YEAR & "/" & @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & " - " ถ้า $OpenCV_AutoitConsoleLogging แล้ว ConsoleWrite($Timestamp & $Message & @CRLF) ถ้า $OpenCV_MatchLogging จากนั้น ในเครื่อง $MatchLogFile = FileOpen(@ScriptDir & "\OpenCV_Match.log", 1) FileWrite($MatchLogFile, $Timestamp & $Message & @CRLF ) FileClose($MatchLogFile) EndIf EndFunc ;==>_Internal_MatchLogger Func _Internal_ErrorLogger($ข้อความ) Local $Timestamp = @YEAR & "/" & @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & " - " ถ้า $OpenCV_AutoitConsoleLogging แล้ว ConsoleWrite( $Timestamp & $Message & @CRLF) ถ้า $OpenCV_ErrorLogging จากนั้น $ErrorLogFile ในเครื่อง = FileOpen(@ScriptDir & "\OpenCV_Error.log", 1) FileWrite($ErrorLogFile, $Timestamp & $Message & @CRLF) FileClose($ErrorLogFile) EndIf EndFunc ;==>_Internal_ErrorLogger ;ฟังก์ชั่น OpenCV ที่สร้างโดย mylise, https://www.autoitscript.com/forum/topic/160732-opencv-udf/ Func _Opencv_BMP2IPL($pBmpImage) Local $iW = _GDIPlus_ImageGetWidth($pBmpImage), $iH = _GDIPlus_ImageGetHeight($pBmpImage) Local $tBitmapData = _GDIPlus_BitmapLockBits($pBmpImage, 0, $iPILMX) ท้องถิ่น $pIPL = _cvCreateImageHeader(_cvSize($iW, $iH), 8, 4) _cvSetData($pIPL, DllStructGetData($tBitmapData, "scan0"), DllStructGetData($tBitmapData, "stride")) $pIplDst ในเครื่อง = _cvCloneImage($pIPL) _cvReleaseImageHeader($pIPL) _GDIPlus_BitmapUnlockBits($pBmpImage, $tBitmapData) ท้องถิ่น $pIplDst2 = _cvCreateImage(_cvSize($iW, $iH), 8, 3) _cvCvtColor($pIplDst, $pIplDst2, 1) _cvReleaseImage($pIplDst) ส่งคืน $pIplDst2 EndFunc ;==>_Opencv_BMP2IPL Func _cvCvtColor($cvsrc, $cvdst, $cvcode) DllCall($_opencv_imgproc, "none:cdecl", "cvCvtColor", "ptr", $cvsrc, "ptr", $cvdst, "int", $cvcode) ถ้า @ error จากนั้น ConsoleWrite("ข้อผิดพลาดใน cvCvtColor") ส่งคืนEndFunc ;==>_cvCvtColor Func _cvCreateImage($cvsize, $cvdepth, $cvchannels) Local $_aResult = DllCall($_opencv_core, "ptr:cdecl", "cvCreateImage", "struct", $cvsize, "int", $cvdepth, "int", $ cvchannels) หาก @error แล้ว ConsoleWrite ("ข้อผิดพลาดใน cvCreateImage") ส่งคืน $_aResult[0] EndFunc ;==>_cvCreateImage Func _cvReleaseImageHeader($cvimage) DllCall($_opencv_core, "none:cdecl", "cvReleaseImageHeader", "ptr*", $cvimage) หาก @error จากนั้น ConsoleWrite ("ข้อผิดพลาดใน cvReleaseImageHeader") ส่งคืนEndImage;==>_cvReleaseHeader Func _cvCloneImage($cvimage) Local $_aResult = DllCall($_opencv_core, "ptr:cdecl", "cvCloneImage", "ptr", $cvimage) ถ้า @error จากนั้น ConsoleWrite ("ข้อผิดพลาดใน cvCloneImage") ส่งคืน $_aResult[0] EndFunc ;==>_cvCloneImage Func _cvSetData($cvarr, $cvdata, $cvstep) DllCall($_opencv_core, "none:cdecl", "cvSetData", "ptr", $cvarr, "ptr", $cvdata, "int", $cvstep) ถ้า @ error จากนั้น ConsoleWrite("ข้อผิดพลาดใน cvSetData") ส่งคืนEndFunc ;==>_cvSetData Func _cvSize($width, $height) Local $vSize = DllStructCreate("int width;" & "int height;") DllStructSetData($vSize, "width", $width) DllStructSetData($vSize, "height", $height ) คืนค่า $vSize EndFunc ;==>_cvSize Func _cvCreateImageHeader($cvsize, $cvdepth, $cvchannels) Local $_aResult = DllCall($_opencv_core, "ptr:cdecl", "cvCreateImageHeader", "struct", $cvsize, "int", $cvdepth, "int", $ cvchannels) หาก @error แล้ว ConsoleWrite ("ข้อผิดพลาดใน cvCreateImageHeader") ส่งคืน $_aResult[0] EndFunc ;==>_cvCreateImageHeader Func _cvMinMaxLoc($cvarr, $cvmin_val, $cvmax_val, $cvmin_loc, $cvmax_loc, $cvmask = "") DllCall($_opencv_core, "none:cdecl", "cvMinMaxLoc", "ptr", $cvarr, "ptr" $cvmin_val, "ptr", $cvmax_val, "ptr", $cvmin_loc, "ptr", $cvmax_loc, "ptr", $cvmask) ถ้า @error แล้ว ConsoleWrite("error in cvMinMaxLoc") ให้ คืนค่า EndFunc ;==>_cvMinMaxLoc Func _cvMatchTemplate($cvimage, $cvtempl, $cvresult, $cvmethod) DllCall($_opencv_imgproc, "none:cdecl", "cvMatchTemplate", "ptr", $cvimage, "ptr", $cvtempl, "cvresult", $cvresult , "int", $cvmethod) หาก @error แล้ว ConsoleWrite ("ข้อผิดพลาดใน cvMatchTemplate") ส่งคืนEndFunc ;==>_cvMatchTemplate Func _cvThreshold($cvsrc, $cvdst, $cvthreshold, $cvmax_value, $cvthreshold_type) Local $_aResult = DllCall($_opencv_imgproc, "double:cdecl", "cvThreshold", "ptr", $cvs, $c, "ptr" , "double", $cvthreshold, "double", $cvmax_value, "int", $cvthreshold_type) หาก @error แล้ว ConsoleWrite("error in cvThreshold") ส่งคืนEndFunc ;==>_cvThreshold Func _cvCreateMat($cvrows, $cvcols, $cvtype) Local $_aResult = DllCall($_opencv_core, "ptr:cdecl", "cvCreateMat", "int", $cvrows, "int", $cvcols, "int", $ cvtype) หาก @error แล้ว ConsoleWrite ("ข้อผิดพลาดใน cvCreateMat") ส่งคืน $_aResult[0] EndFunc ;==>_cvCreateMat Func _cvGetSize($pimage) Local $_aResult = DllCall($_opencv_core, "int64:cdecl", "cvGetSize", "ptr", $pimage) ถ้า @error แล้ว ConsoleWrite("error csize image ") Local $width = BitAND( 0xFFFFFFFF, $_aResult[0]) Local $height = Int($_aResult[0] / 2 ^ 32) Local $vSize = DllStructCreate("int width;" & "int height;") DllStructSetData($vSize, "width" , $width) DllStructSetData($vSize, "height", $height) คืนค่า $vSize EndFunc ;==>_cvGetSize Func _cvReleaseMat($cvmat) DllCall($_opencv_core, "none:cdecl", "cvReleaseMat", "ptr*", $cvmat) หาก @error จากนั้น ConsoleWrite ("ข้อผิดพลาดใน cvReleaseMat") ส่งคืนEndFunc ;==>_cvReleaseMat Func _cvReleaseImage($pimage) DllCall($_opencv_core, "none:cdecl", "cvReleaseImage", "ptr*", $pimage) ถ้า @error แล้ว ConsoleWrite ("ข้อผิดพลาดของอิมเมจรีลีส") EndFunc ;==>_cvReleaseImage Func _cvLoadImage($filename, $iscolor = 1) ถ้า $filename = "" จากนั้น Return SetError(1) $_aResult = DllCall($_opencv_highgui, "int:cdecl", "cvLoadImage", "str", $filename, "int ", $iscolor) ถ้า @error แล้วก็ ConsoleWrite("ไฟล์ไม่โหลด") ถ้าไม่ใช่ IsArray($_aResult) จากนั้น MsgBox(16, "Error", "Failed loading DLLs.") _OpenCV_Shutdown() ออกจาก EndIf Return $_aResult[0 ] EndFunc ;==>_cvLoadImage Func _OpenCV_Shutdown() DllClose($_opencv_core) DllClose($_opencv_highgui) DllClose($_opencv_imgproc) _GDIPlus_Shutdown() EndFunc ;==>_OpenCV_Shutdown Func _OpenCV_Startup() $_opencv_core = DllOpen("DLLs\opencv_core2413.dll") $_opencv_highgui = DllOpen("DLLs\opencv_highgui2413.dll") $_opencv_imgproc = DllOpen("DLLs\opencv_img" Proc2413.dll) = เปิด adamve 1 Link to comment Share on other sites More sharing options...
Developers Jos Posted September 11, 2022 Developers Share Posted September 11, 2022 Moved to the appropriate AutoIt General Help and Support forum, as the Developer General Discussion forum very clearly states: Quote General development and scripting discussions. Do not create AutoIt-related topics here, use the AutoIt General Help and Support or AutoIt Technical Discussion forums. Moderation Team SciTE4AutoIt3 Full installer Download page - Beta files Read before posting How to post scriptsource Forum etiquette Forum Rules Live for the present, Dream of the future, Learn from the past. Link to comment Share on other sites More sharing options...
robertocm Posted September 13, 2022 Share Posted September 13, 2022 Try this OpenCV Match UDF, see in the examples the parameter to indicate a specific area of the screen (coordinates) Link to comment Share on other sites More sharing options...
adamve Posted November 28, 2022 Share Posted November 28, 2022 It worked fine, thank you Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now