Autor
|
Thema: Win7 - Fensterproblem (6345 mal gelesen)
|
tberger Mitglied Application Manager CATIA V5 / V6
Beiträge: 1385 Registriert: 13.01.2007 WIN 7 64bit V5R21SP3HF49 3DX/V6 R2016x
|
erstellt am: 04. Mai. 2012 08:07 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich habe einige Makros, bei denen ein CATIA-Befehlsfenster (gestartet mit StartCommand) mittels kleiner Timerschleife und senden eines <ENTER> schlichtweg nur bestätigt wird, um weiteres im nachfolgenden Code ausführen zu können. Stand damals R19SP3 auf Win XP. Bei unserer Testinstallation Win7 und R21SP3 scheinen nun die Fenster nicht mehr rechtzeitig zu kommen bzw. im Hintergrund zu liegen. Somit wird dann das "oberste" bzw. aktive Fenster bestätigt und natürlich kommt dann nur Quark dabei raus. Kann mir jemand zu diesem Problem der Fensterfolge etwas berichten? Oder muss ich wirklich über die Windows-Logik das Fenster ausfindig machen (was natürlich nicht funktionieren kann, wenn das Fenster nach dem SendCommand gar nicht erst trotz timer rechtzeitig aufkommt sondern zu spät = erst nach Makrolauf)? ------------------ Grüße aus dem Thurgau Thomas +++++++++++++++++++++++++++++++++ CATIA - eine Laune der Natur ... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Jens Hansen Mitglied Senior Consult
Beiträge: 1055 Registriert: 05.08.2000 Win7 CATIA V5 R19 VB.Net C#
|
erstellt am: 04. Mai. 2012 08:35 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
|
RSchulz Moderator² Head of CAD, Content & Collaboration / IT-Manager
Beiträge: 5541 Registriert: 12.04.2007 @Work Lenovo P510 Xeon E5-1630v4 64GB DDR4 Quadro P2000 256GB PCIe SSD 512GB SSD SmarTeam V5-6 R2016 Sp04 CATIA V5-6 R2016 Sp05 E3.Series V2019 Altium Designer/Concord 19 Win 10 Pro x64
|
erstellt am: 04. Mai. 2012 08:52 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Hallo Thomas, ja das Problem kenne ich. Es hat mit den Auf- und Abblendfunktionen von Win7 zu tun. Du musst mit einer Warteschleife die Verarbeitung um ca. eine halbe Sekunde verzögern, denn die Holfunktion hat das gleiche Problem. Das Problem ist, dass das Fenster schon gefunden wird, wärend es noch schön nach oben geslidet wird. Zu diesem Zeitpunkt reagiert das Fenster aber noch nicht auf Sendkey-Befehle. Die Verzögerung liegt generell im Millisekundenbereich, ist aber von CPU-Leistung etc. abhängig. Daher würde ich die Verzögerung nicht zu knapp bemessen. Ich habe festgestellt, dass die halbe Sekunde Verzögerung erstens nicht wirklich spürbar ist und zweitens mehr als ausreicht. ------------------ MFG Rick Schulz Nettiquette (CAD.de) - Was ist die Systeminfo? - Wie man Fragen richtig stellt. - Unities Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 04. Mai. 2012 08:55 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Ich kann Jens da nur zustimmen, da musste leider in die Windows-API reingreifen. Eventuell hilft aber auch schon AppActivate (damit kann man auch manche Fenster in den Vordergrund holen). ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tberger Mitglied Application Manager CATIA V5 / V6
Beiträge: 1385 Registriert: 13.01.2007 WIN 7 64bit V5R21SP3HF49 3DX/V6 R2016x
|
erstellt am: 04. Mai. 2012 09:01 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank erst mal an euch alle, das ging ja flott. Werde das versuchen umzusetzen. ------------------ Grüße aus dem Thurgau Thomas +++++++++++++++++++++++++++++++++ CATIA - eine Laune der Natur ... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
geekv5 Mitglied Konstrukteur
Beiträge: 214 Registriert: 13.07.2011 Notebook<P>MSI GX660R Intel Core i5 460M 8GB DDR3 1GB Mobility HD5870 80GB Intel X25-M Postville 250GB HDD<P>Desktop<P>AMD Phenom II X4 965 1GB HD4890@ FirePro V8700 8GB DDR3-1600 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
|
erstellt am: 15. Jun. 2012 15:05 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Ist zwar schon etwas her, aber ich hatte das selbe Problem und hab das folgendermaßen unter Zuhilfenahme der Win32 API realisiert: Code:
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long Public Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Public Const WM_GETTEXT = &HD Public Const BM_CLICK = &HF5& Public O_hwnd As Long Public C_hwnd As LongSub CATMain() CATIA.StartCommand "StartCommand" CATIA.RefreshDisplay = True Do While F_hwnd = 0 Sleep 500 F_hwnd = FindWindow(vbNullString, "FensterName") Loop EnumChildWindows F_hwnd, AddressOf EnumChildWindow, 0 Do While F_hwnd <> 0 Sleep 500 F_hwnd = FindWindow(vbNullString, "FensterName") Loop End Sub Public Function EnumChildWindow(ByVal hChild As Long, ByVal lParam As Long) As Long Dim iClass As String Dim iText As String Dim j As Integer iClass = Space(256) j = GetClassName(hChild, iClass, 63) iClass = Left(iClass, j) iText = Space(256) j = SendMessage(hChild, WM_GETTEXT, 255, iText) iText = Left(iText, j) If iText = "OK" Then O_hwnd = hChild SendMessage O_hwnd, BM_CLICK, 0, 0 End If EnumChildWindow = 1 End Function
Es wird gewartet bis das Fenster offen ist, dann wird OK geklickt und wieder gewartet bis das Fenster zu ist.. Vielleicht hat noch jmd Verwendung dafür Gruß [Diese Nachricht wurde von geekv5 am 15. Jun. 2012 editiert.] [Diese Nachricht wurde von geekv5 am 15. Jun. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
imation1999 Mitglied dipl.-ing. Maschinenbau
Beiträge: 276 Registriert: 02.08.2011 Dell Precision T3500 Intel® Xeon® Quad Core NVIDIA Quadro® 5000 Win7 x64 Ultimate CATIA V5 R20 SP2
|
erstellt am: 30. Jan. 2015 13:12 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
|
RSchulz Moderator² Head of CAD, Content & Collaboration / IT-Manager
Beiträge: 5541 Registriert: 12.04.2007 @Work Lenovo P510 Xeon E5-1630v4 64GB DDR4 Quadro P2000 256GB PCIe SSD 512GB SSD SmarTeam V5-6 R2016 Sp04 CATIA V5-6 R2016 Sp05 E3.Series V2019 Altium Designer/Concord 19 Win 10 Pro x64
|
erstellt am: 30. Jan. 2015 13:32 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
|
runkelruebe Ehrenmitglied V.I.P. h.c. Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 Drauß vom Walde komm ich her, verlaufen hab ich mich gar sehr ;-)
|
erstellt am: 30. Jan. 2015 13:51 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Moin, ich widerspreche nur ungern hochgeschätzten usern ( Rick) in fremden Brettern, aber ich würde die Fehlermeldung "The code in this project must be updated for use on 64-bit systems" eher in diese Richtung interpretieren wollen: http://goo.gl/yMnvy4 (gekürzt, da die Forensoftware die Originaladresse nicht mag, führt zu msdn.microsoft.com ) VBA-Makro wurde unter 32bit entwickelt und soll jetzt auf einem 64bit-System laufen. Mehr dazu inkl. vieler hilfreicher links siehe u.a. auch im SWX-Brett: http://forum.cad.de/foren/ubb/Forum2/HTML/025464.shtml Sollte es das nicht gewesen sein: War nett bei euch, schönes Wochenende! [rredit]links gefixt[/rredit] ------------------ Gruß, runkelruebe Herr Kann-ich-nich wohnt in der Will-ich-nich-Straße... [Diese Nachricht wurde von runkelruebe am 30. Jan. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
JPF Mitglied Programmierer
Beiträge: 128 Registriert: 17.08.2001 CATIA V5R19 SP9--HP420,Intel(R) Xeon(R) CPU E5-1620 3.60GHz,32 GB Ram, NVIDIA Quadro 2000--Windows 7 Enterprise 64bit
|
erstellt am: 02. Feb. 2015 07:10 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Hallo Zusammen, dieses Problem hatte ich auch! Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Geholfen hat mir aus "AS LONG" ein "AS INTEGER" zu machen. Gruss JPF Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 02. Feb. 2015 09:44 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Hallo JPF, das widerspricht allem, was ich über die Api weiss - oder zu wissen glaube. Der Rückgabewert von Findwindow ist ein Handle zum gefundenen Fenster. Seit 32-bit Windows(VB4/32; WinNT) ist der Wert vom Typ 'long', unter Win3 war der Wert 'Integer'. Ein Auszug aus dem SDK: Zitat:
FindWindowThe FindWindow function retrieves a handle to the top-level window whose class name and window name match the specified strings. This function does not search child windows. This function does not perform a case-sensitive search. . . . Return Values If the function succeeds, the return value is a handle to the window that has the specified class name and window name.
Ich denk mal, das Problem liegt woanders. Tschau, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 02. Feb. 2015 11:47 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Hallo imation, probier's mal hiermit: Bas-Modul:
Code:
Option Explicit Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Const BM_CLICK = &HF5&'--------------------------------------------------------------------------------------- ' Procedure : CloseDialog ' Author : jherzog ' Date : 02.02.2015 ' Time : 11:25 ' Languages : VB6 Pro SP6 ' V5-Release: V5R19/21 ' Purpose : Close open dialog window by sending click message ' Parms : strDlgWnd: Dialog window's title ' : strBtnWnd: Button's text ' Ret. Value: - ' ' Syntax : CloseDialog "Properties", "OK" ' ' Prereqs : Opened dialog window ' Remarks : Select a valid element in the Catia tree first ' : Tested with V5R19 and V5R21; Win7/64 Pro '--------------------------------------------------------------------------------------- ' Public Sub CloseDialog(strDlgWnd As String, strBtnWnd As String) Dim hWndDlg As Long Dim hWndOKButton As Long 'get dialog's handle hWndDlg = FindWindow(vbNullString, strDlgWnd) 'get OK button's handle hWndOKButton = FindWindowEx(hWndDlg, 0&, vbNullString, strBtnWnd) 'close dialog window SendMessage hWndOKButton, BM_CLICK, 0, 0 End Sub
Form:
Code:
. . . CATIA.StartCommand "Properties" CATIA.RefreshDisplay = True CloseDialog "Properties", "OK"
Öffnet und schliesst das 'Properties'-Fenster (nachdem ich nicht weiss, welcher Dialog Dir Ärger macht). Wichtig ist, dass vor der Makro-Ausführung etwas im Strukturbaum aktiviert wird, das auch 'Properties' besitzt. Sonst gibt's eine Fehlermeldung von Catia. Hope it helps, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
imation1999 Mitglied dipl.-ing. Maschinenbau
Beiträge: 276 Registriert: 02.08.2011 Dell Precision T3500 Intel® Xeon® Quad Core NVIDIA Quadro® 5000 Win7 x64 Ultimate CATIA V5 R20 SP2
|
erstellt am: 04. Feb. 2015 06:31 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
|
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 04. Feb. 2015 12:03 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Hallo imation, das liegt vermutlich an VBA7. Siehe hierzu: [URL=https://msdn.microsoft.com/en-us/library/ee691831%28loband%29.aspx#odc_office2010_Compatibility32bit64bit_IntroducingVBA7CodeBase][/URL] Ersetze die Zeilen:
Code:
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
mit folgenden(ungetestet; ich hab noch R19):
Code:
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Ich hab versucht den im Link zitierten Artikel umzusetzen. Denkbar wäre auch die konditionellen Kompilier-Konstanten zu verwenden a la #if VBA7 then . . Unter Umständen musst noch ein wenig nachfeilen. Hope it helps, Joe PS: Welche Commands startest Du denn (z.B.? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 04. Feb. 2015 14:08 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Sieht so aus, als müsste die Deklaration für FindWEindow so lauten: Code:
Private Declare PtrSafe Function FindWindow _ Lib "USER32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
FindwindowEx entspechend. Sendmessage vermutlich auch. Tschau,
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
imation1999 Mitglied dipl.-ing. Maschinenbau
Beiträge: 276 Registriert: 02.08.2011 Dell Precision T3500 Intel® Xeon® Quad Core NVIDIA Quadro® 5000 Win7 x64 Ultimate CATIA V5 R20 SP2
|
erstellt am: 04. Feb. 2015 18:18 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Hallo Joe, vielen Dank für Deine Mühe. Ich habe die Deklaration umgeschrieben und jetzt kriege ich ein Error "type of mismatch" hier:
Code: EnumChildWindows F_hwnd, AddressOf EnumChildWindow, 0
StartCommand: "Generate CATPart from Product"
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 04. Feb. 2015 19:17 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Wie hast Du EnumChildWindows deklariert? So? Statt: Code:
Public Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
für VBA7 so: Code:
Public Declare PtrSafe Function EnumChildWindows Lib "user32" (ByVal hWndParent As LongPtr, ByVal lpEnumFunc As LongPtr, ByVal lParam As Long) As LongPtr
Nachdem ich's auch nicht sicher weiss, würde ich erstmal wie oben beschrieben ausprobieren, danach lParam auf longPtr setzen. Vielleicht hilft's auch für den Wert von lParam '0&' zu schreiben. Falls Du's noch nicht getan hast: Wenn ich mich recht entsinne, müssen die Procs zu Callback-Funktionen in einem Modul abgelegt werden, d.h. die 'EnumChildWindow'-Prozedur müsste in ein Modul. Tschau, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 04. Feb. 2015 19:52 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Ich hab noch 'n Bißchen gespielt mit ProductToPart und dabei meine kleine Routine leicht verändert. Ergebnis: Form:
Code:
CATIA.StartCommand "Generate CATPart from Product" CloseDialog "Generate CATPart from Product", "OK"
Modul:
Code:
'--------------------------------------------------------------------------------------- ' Procedure : CloseDialog ' Author : jherzog ' Date : 02.02.2015 ' Time : 11:25 ' Languages : VB6 Pro SP6 ' V5-Release: V5R19/21 ' Purpose : Close open dialog window by sending click message ' Parms : strDlgWnd: Dialog window's title ' : strBtnWnd: Button's text ' Ret. Value: - ' ' Syntax : CloseDialog "Properties", "OK" ' ' Prereqs : Opened dialog window ' Remarks : Select a valid element in the Catia tree first ' : Tested with V5R19 and V5R21; Win7/64 Pro '--------------------------------------------------------------------------------------- ' Public Sub CloseDialog(strDlgWnd As String, strBtnWnd As String) Dim hWndDlg As Long Dim hWndButton As Long Do While hWndDlg = 0 'wait for handle 'get dialog's handle hWndDlg = FindWindow(vbNullString, strDlgWnd) DoEvents 'do something else Loop Do While hWndButton = 0 'wait for handle 'get OK button's handle hWndButton = FindWindowEx(hWndDlg, 0&, vbNullString, strBtnWnd) DoEvents Loop 'close dialog window SendMessage hWndButton, BM_CLICK, 0&, 0& End Sub
Die Deklarationen müssen natürlich noch für VBA7 umgeschrieben werden. das gilt vermutlich auch für die Dims. Aus Code:
Dim hWndDlg As Long Dim hWndButton As Long
wird dann Code:
Dim hWndDlg As LongPtr Dim hWndButton As LongPtr
Ausserdem ist keinerlei Fehlerbehandlung vorhanden. Die Schleifen lassen sich aber abbrechen. Hope it helps, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
imation1999 Mitglied dipl.-ing. Maschinenbau
Beiträge: 276 Registriert: 02.08.2011 Dell Precision T3500 Intel® Xeon® Quad Core NVIDIA Quadro® 5000 Win7 x64 Ultimate CATIA V5 R20 SP2
|
erstellt am: 05. Feb. 2015 08:26 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Hallo Joe, danke für den Code. Die Deklarationen habe ich umgeschrieben. Wenn ich im VBA-Modus (VB7.1, CATIA R24/64bit) mit F8 debugge, es funktioniert einwandfrei. Wenn ich das Makro mit "Run" (F5) starte, dann bleibt es hier stehen und "Generate CATPart from Product" Fenster wird nicht gezeigt: Code: Do While hWndDlg = 0 'wait for handle 'get dialog's handle hWndDlg = FindWindow(vbNullString, strDlgWnd) -----> DoEvents 'do something else Loop
Sobald ich auf "Break" drücke, hochpopt das Fenster "Generate CATPart from Product". [Diese Nachricht wurde von imation1999 am 05. Feb. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 05. Feb. 2015 12:19 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Hallo imation, dass das Makro da anhält, ist normal. Dafür ist der DoEvents schliesslich da. Ohne den könntest die Routine nur per Taskmanager killen. Anders ausgedrückt: Catia wird wegen des DoEvents nicht angehalten. Eigentlich wird der StartCommand nicht behindert. Warum der Dialog nicht aufgeht, weiss ich jetzt auf anhieb auch nicht. (Bei mir funktioniert's :-j ) Frage: Was passiert, wenn Du den CloseDialog-Aufruft auskommentierst? Läuft ProdToPart dann? Kommt der Dialog? Denkbare Abhilfen: - Catia.RefreshDisplay = False (vor den Schleifen); Nutzen: Unwahrscheinlich - Vor dem CloseDialog einen Sleep einfügen. Wenn der Dialog bei obigem Test aufgeht, sollte das helfen. Tschau, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
imation1999 Mitglied dipl.-ing. Maschinenbau
Beiträge: 276 Registriert: 02.08.2011 Dell Precision T3500 Intel® Xeon® Quad Core NVIDIA Quadro® 5000 Win7 x64 Ultimate CATIA V5 R20 SP2
|
erstellt am: 05. Feb. 2015 18:20 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
|
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 05. Feb. 2015 18:32 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
|
imation1999 Mitglied dipl.-ing. Maschinenbau
Beiträge: 276 Registriert: 02.08.2011 Dell Precision T3500 Intel® Xeon® Quad Core NVIDIA Quadro® 5000 Win7 x64 Ultimate CATIA V5 R20 SP2
|
erstellt am: 05. Feb. 2015 18:58 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Also bei mir (VBA 7.1) funktioniert es nur so (3x "RefreshDisplay"): Code: Public Sub CloseDialog(strDlgWnd As String, strBtnWnd As String) Dim hWndDlg As LongPtr Dim hWndButton As LongPtr CATIA.RefreshDisplay = True Do While hWndDlg = 0 'wait for handle 'get dialog's handle hWndDlg = FindWindow(vbNullString, strDlgWnd) DoEvents 'do something else Loop CATIA.RefreshDisplay = True Do While hWndButton = 0 'wait for handle 'get OK button's handle hWndButton = FindWindowEx(hWndDlg, 0&, vbNullString, strBtnWnd) DoEvents Loop 'close dialog window SendMessage hWndButton, BM_CLICK, 0&, 0& CATIA.RefreshDisplay = True Do While hWndDlg <> 0 hWndDlg = FindWindow(vbNullString, strDlgWnd) DoEvents 'do something else Loop End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 05. Feb. 2015 19:08 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Interessant find ich die letzte Schleife. Wenn ich's richtig sehe, wartet die Schleife darauf, dass der Dialog verschwindet. Es müsste eigentlich auch ohne funktionieren. Wie sehen die Deklarationen der Api-Funktionen aus? Neugierig, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
imation1999 Mitglied dipl.-ing. Maschinenbau
Beiträge: 276 Registriert: 02.08.2011 Dell Precision T3500 Intel® Xeon® Quad Core NVIDIA Quadro® 5000 Win7 x64 Ultimate CATIA V5 R20 SP2
|
erstellt am: 05. Feb. 2015 19:26 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Ja, es funktioniert natürlich ohne die letzte Schleife, aber ich brauche es für die weitere Bearbeitungen (umbenennen, abspeichern, etc.) die Deklarationen, wie Du schon oben geschrieben hast, zB.:
Code: Private Declare PtrSafe Function FindWindow _ Lib "USER32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 06. Feb. 2015 13:52 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Eigentlich wollte ich mich über die 3 DisplayRefreshes wundern, nachdem eigenlich 1x reichen müsste; mehr wie an geht nicht. Dann hab ich das noch im Internet gefunden: Titel: CATIA Macro SendKeys Link: http://www.scripting4v5.com/additional-articles/catia-macro-sendkeys/ Zitat:
SendKeys “{Enter}” It’s a good idea to code all SendKeys commands following a Display Refresh. See sample code below:SubCATMain() CATIA.StartCommand(“Disassemble”) CATIA.RefreshDisplay = True SendKeys “{ENTER}” End Sub Often, without the Display Refresh, the keystrokes will be sent so fast that the interface will still be processing the last line of code. Adding “CATIA.RefreshDisplay = True” will slow the process down and make SendKeys wait until it’s ready.
Im Prinzip verwendet der Schreiber RefreshDisplay als Ausführungsbremse. Als kleine Ergänzung. Tschau, Joe PS: Die Hochkommas sind alle nicht code-kompatibel. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
imation1999 Mitglied dipl.-ing. Maschinenbau
Beiträge: 276 Registriert: 02.08.2011 Dell Precision T3500 Intel® Xeon® Quad Core NVIDIA Quadro® 5000 Win7 x64 Ultimate CATIA V5 R20 SP2
|
erstellt am: 06. Feb. 2015 14:36 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Hallo Joe, das Makro anhält so bei die letzte Schleife, also hier: [CODE][ Do While hWndDlg <> 0/CODE] "sleep" hat hier wieder nichts gebracht. PS.: wie kann ich nach ein CheckBox suchen? Mit "FindWindowsEx" habe ich es nicht gefunden. Mit "EnumChildWindow" hat gut geklappt. (Das gefällt mir aber nicht) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 06. Feb. 2015 17:14 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Hallo, Eine Checkbox ist nix anderes als ein Fenster der Klasse Button, Stil BS_CHECKBOX(Checkbox). Die Krux bei FindWindowEx ist, dass es nur in der direkt darunter liegenden Ebene sucht. D.h, dass Du Dich unter Umständen runterhangeln musst. Bei komplexeren Dialogen wird das mühsam bis unmöglich. Beispiel: - Properties-Dialog: (siehe Bild) - 1 Hauptfenster(Container) - 3 Buttons, 4/5 Tabs, etc. - zu jedem Tab noch viele darunter liegende Ebenen/Fenster Nicht alle Fenster besitzen einen Titel(WindowName), manchmal nur eine Klasse. Bei derart aufgefächerten Dialogen würd' ich auch EnumChildWindows verwenden. Ein paar Beispielpragramme dazu: http://vbnet.mvps.org/code/enums/enumwindowsdemo.htm http://vb.mvps.org/samples/PassSniff/ Noch eines von AllApi.Net(die Homepage existiert nicht mehr.) 'in a form
Code:
Private Sub Form_Load() 'KPD-Team 2000 'URL: http://www.allapi.net/ 'E-Mail: KPDTeam@Allapi.net Me.AutoRedraw = True EnumChildWindows GetDesktopWindow, AddressOf EnumChildProc, ByVal 0& End Sub
'in a module Code:
Declare Function GetDesktopWindow Lib "user32" () As Long Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long Public Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long Dim sSave As String 'Get the windowtext length sSave = Space$(GetWindowTextLength(hwnd) + 1) 'get the window text GetWindowText hwnd, sSave, Len(sSave) 'remove the last Chr$(0) sSave = Left$(sSave, Len(sSave) - 1) If sSave <> "" Then Form1.Print sSave 'continue enumeration EnumChildProc = 1 End Function
Wenn Du erstmal den Handle zum Fenster hast, steht Dir alles andere offen. Hope it helps, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
imation1999 Mitglied dipl.-ing. Maschinenbau
Beiträge: 276 Registriert: 02.08.2011 Dell Precision T3500 Intel® Xeon® Quad Core NVIDIA Quadro® 5000 Win7 x64 Ultimate CATIA V5 R20 SP2
|
erstellt am: 06. Feb. 2015 18:03 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
|
buecherm83 Mitglied Ingenieur IT Application Software
Beiträge: 78 Registriert: 20.09.2011 SIEMENS NX10 CATIA V5 R26 VB7.1 Tecnomatix Process Designer/Simulate<P>Win7 64bit Office 2016
|
erstellt am: 05. Aug. 2015 10:33 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Hallo, ich habe ein Problem mit deinem Code. Ich benutze diesen um die Replace Funktion zu starten. An der Stelle "j = SendMessage(hChild, WM_GETTEXT, 255, iText)" bekomme ich eine Fehlermeldung: Type Mismatch. Ich benutze R24 mit VBA7.1. Ich habe alle Declarationen angepasst wie im folgenden zu sehen. Das Makro läuft bis auf diesen Fehler einwandfrei durch. Vielen Dank für die Hilfe. Grüße
Code: Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPublic Declare PtrSafe Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As LongPtr, ByVal lpClassName As String, ByVal nMaxCount As LongPtr) As Long Private Declare PtrSafe Function EnumChildWindows Lib "user32" (ByVal hWndParent As LongPtr, ByVal lpEnumFunc As LongPtr, ByVal lParam As LongPtr) As Long Public Declare PtrSafe Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As LongPtr, ByVal wMsg As LongPtr, ByVal wParam As LongPtr, ByVal lParam As Any) As LongPtr Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Public Const WM_GETTEXT = &HD Public Const BM_CLICK = &HF5& Public O_hwnd As LongPtr Public C_hwnd As LongPtr ... Public Function FindButtonOK(ByVal hChild As LongPtr, ByVal lParam As LongPtr) 'as As LongPtr Dim iClass As String Dim iText As String Dim j As Integer ' alle Elemente des Fensters finden iClass = Space(256) j = GetClassName(hChild, iClass, 63) iClass = Left(iClass, j) iText = Space(256) j = SendMessage(hChild, WM_GETTEXT, 255, iText) iText = Left(iText, j) If iText = "OK" Then 'Pruefen ob es der OK-Button ist O_hwnd = hChild SendMessage O_hwnd, BM_CLICK, 0&, 0& ' Button klicken End If FindButtonOK = 1 End Function
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 05. Aug. 2015 11:12 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Hallo buecherm, SendMessage ist eine der wandelbarsten Funktionen der Api. Und ein String kann auch als ein Array von Zeichen betrachtet werden. Füge bitte eine 2. Deklaration für SendMessage _hinzu_:
Code:
Public Declare PtrSafe Function SendMessageByRef Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As LongPtr, ByVal wMsg As LongPtr, ByVal wParam As LongPtr, lParam As Any) As LongPtr
Das 'ByVal' hab ich bei lParam wegelassen; somit wird lParam 'byref' übergeben(als Adresse). Und ändere die Anweisung entsprechend ab:
Code:
iText = Space(256) j = SendMessageByRef(hChild, WM_GETTEXT, 255, iText)
Hope it helps, Joe ------------------ The problem with the world is that the intelligent people are full of doubts, while the stupid ones are full of confidence. ~Charles Bukowski Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
buecherm83 Mitglied Ingenieur IT Application Software
Beiträge: 78 Registriert: 20.09.2011 SIEMENS NX10 CATIA V5 R26 VB7.1 Tecnomatix Process Designer/Simulate<P>Win7 64bit Office 2016
|
erstellt am: 05. Aug. 2015 11:35 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
|
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 05. Aug. 2015 11:45 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
ich stell' das mal unter R19 nach. Vorher noch zwei Fragen: (oder drei) :-) - Welchen Dialog willst Du untersuchen? - Was willst Du finden? - Was willst Du tun? Tschau, Joe
------------------ The problem with the world is that the intelligent people are full of doubts, while the stupid ones are full of confidence. ~Charles Bukowski Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
buecherm83 Mitglied Ingenieur IT Application Software
Beiträge: 78 Registriert: 20.09.2011 SIEMENS NX10 CATIA V5 R26 VB7.1 Tecnomatix Process Designer/Simulate<P>Win7 64bit Office 2016
|
erstellt am: 05. Aug. 2015 12:26 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
|
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 05. Aug. 2015 12:59 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Das dauert jetzt a bisserl. Was mir noch an deinem Code aufgefallen ist: 'j' wird als integer deklariert; sowohl getClassname als auch SendMessage geben aber 'long' zurück. Das ist auch im Original falsch. Tschau, Joe ------------------ The problem with the world is that the intelligent people are full of doubts, while the stupid ones are full of confidence. ~Charles Bukowski Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 05. Aug. 2015 15:08 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Noch 'ne Frage: - 'Replace' gibt's als Kommando nicht. Was soll's sein? 'Replace Component...'? Tschau, Joe ------------------ The problem with the world is that the intelligent people are full of doubts, while the stupid ones are full of confidence. ~Charles Bukowski Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
buecherm83 Mitglied Ingenieur IT Application Software
Beiträge: 78 Registriert: 20.09.2011 SIEMENS NX10 CATIA V5 R26 VB7.1 Tecnomatix Process Designer/Simulate<P>Win7 64bit Office 2016
|
erstellt am: 05. Aug. 2015 15:22 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
|
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 05. Aug. 2015 15:29 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Du meinst vermutlich 'Replace...' von der Gen. Surf Design Workbench? Ich bleib dabei: 'Replace' kennt Catia nicht. (Ich arbeite auch unter der engl. Oberfläche.) Bitte schick mir ein Bild vom Dialog. Tschau, Joe ------------------ The problem with the world is that the intelligent people are full of doubts, while the stupid ones are full of confidence. ~Charles Bukowski Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
buecherm83 Mitglied Ingenieur IT Application Software
Beiträge: 78 Registriert: 20.09.2011 SIEMENS NX10 CATIA V5 R26 VB7.1 Tecnomatix Process Designer/Simulate<P>Win7 64bit Office 2016
|
erstellt am: 06. Aug. 2015 11:42 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
|
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 06. Aug. 2015 22:24 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Ich behaupte mal, dass das zitierte(gelinkte) Beispiel nie funktioniert hat. Warum hast eigentlich den Web Master der Seite nicht angesprochen? Ausserdem: Der Code ist nicht von mir. Um Dich nicht gänzlich im Regen stehen zu lassen: Ein Wireframe-Element auswählen und folgenden, in ein Modul kopierten Code ausführen:
Code:
Option ExplicitDeclare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Declare Function EnumChildWindows Lib "user32" (ByVal hwndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Public hwnd_OK As Long Public hwnd_Cancel As Long Public hwnd_Delete As Long Public hwndDlg As Long Sub CATMain() Dim oSel As Selection Set oSel = CATIA.ActiveDocument.Selection If oSel.Count2 = 0 Then MsgBox "Select wireframe element before starting this macro!", vbOKOnly Or vbCritical Exit Sub End If CATIA.StartCommand "Replace..." Sleep 500 GetDlgHandles "Replace" End Sub Public Sub GetDlgHandles(strDlgWnd As String) hwndDlg = FindWindow(vbNullString, strDlgWnd) 'get parent handle If hwndDlg = 0 Then 'no such window MsgBox "Dialog not found!", vbOKOnly Or vbCritical, "GetDlgHandles" Exit Sub End If EnumChildWindows hwndDlg, AddressOf EnumChildProc, 0& 'get children handles MsgBox "Handles: " & vbCr _ & "Dialog: " & hwndDlg & vbCr _ & "OK Btn: " & hwnd_OK & vbCr _ & "Cancel: " & hwnd_Cancel & vbCr _ & "Delete: " & hwnd_Delete End Sub '--------------------------------------------------------------------------------------- ' Procedure : EnumChildProc ' Author : jherzog ' Date : 13.02.2015 ' Time : 15:14 ' Languages : VB6 Pro SP6 ' V5-Release: V5R19/21 ' Purpose : Find and identify child windows ' Parms : hwndChild: handle to a child window ' : lParam: not used ' Ret. Value: Handles to three buttons ' ' The handles are declared 'Public' ' Syntax : - (callback function) ' ' Prereqs : Call to EnumChildWindows ' Remarks : Expects open dialog window '--------------------------------------------------------------------------------------- ' Public Function EnumChildProc(ByVal hwndChild As Long, ByVal lParam As Long) As Long Dim strBuff As String 'string buffer strBuff = Space$(GetWindowTextLength(hwndChild) + 1) 'Get the windowtext length GetWindowText hwndChild, strBuff, Len(strBuff) 'get the window text strBuff = Left$(strBuff, Len(strBuff) - 1) 'remove the last Chr$(0) Select Case strBuff Case "Cancel" 'look for 'Cancel' hwnd_Cancel = hwndChild 'assign to public handle Case "OK" 'look for 'OK' hwnd_OK = hwndChild Case "Delete replaced elements and exclusive parents" 'look for 'Delete replaced elements and exclusive parents' hwnd_Delete = hwndChild Case Else End Select Debug.Print strBuff EnumChildProc = 1 'continue enumeration End Function 'Output von Debug.Print: 'OK 'Cancel 'ReplaceFrame_ 'Replace: 'ToReplace_ 'With: 'ForReplace_ ' ' '1 pointing Element: Join 0.1 'Delete replaced elements and exclusive parents
Der wesentliche Unterschied ist, dass ich nicht über die Klassen gehe, sondern über die Caption. Tschau, Joe
PS: Anbei noch ein Screen Shot der Klassen des Dialogs aus Spy++. ------------------ The problem with the world is that the intelligent people are full of doubts, while the stupid ones are full of confidence. ~Charles Bukowski [Diese Nachricht wurde von joehz am 06. Aug. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
buecherm83 Mitglied Ingenieur IT Application Software
Beiträge: 78 Registriert: 20.09.2011 SIEMENS NX10 CATIA V5 R26 VB7.1 Tecnomatix Process Designer/Simulate<P>Win7 64bit Office 2016
|
erstellt am: 07. Aug. 2015 11:39 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Danke für deine Antwort. ich bin dabei es mit deinem Code zu versuchen. Allerdings habe ich ein Problem mit folgender Zeile Code: strBuff = Space$(GetWindowTextLength(hwndChild) + 1)
Wie muss
Code: Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
unter VBA7 deklariert werden? Habe hierfür nur Funktionen für VBA6 gefunden. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 07. Aug. 2015 12:21 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
|
buecherm83 Mitglied Ingenieur IT Application Software
Beiträge: 78 Registriert: 20.09.2011 SIEMENS NX10 CATIA V5 R26 VB7.1 Tecnomatix Process Designer/Simulate<P>Win7 64bit Office 2016
|
erstellt am: 10. Aug. 2015 10:57 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Hallo, noch eine kurze Frage zu deinem Script. ich habe es jetzt soweit für mich angepasst, dass es läuft. Ich möchte jetzt aber noch, das Feld "With" mit einer zweiten Selektion automatisch befüllen lassen. Hast du eine Idee wie ich das Feld ansprechen kann? [Diese Nachricht wurde von buecherm83 am 10. Aug. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 10. Aug. 2015 13:31 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
Das 'Feld' ist eine ListBox mit Name 'ForReplace_'. Direkt ansprechen nützt nix. Catia wartet auf eine Eingabe, ein selektiertes Element. Du musst vermutlich ein Drahtelement in die Selektion nehmen. Tschau, Joe ------------------ The problem with the world is that the intelligent people are full of doubts, while the stupid ones are full of confidence. ~Charles Bukowski Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
buecherm83 Mitglied Ingenieur IT Application Software
Beiträge: 78 Registriert: 20.09.2011 SIEMENS NX10 CATIA V5 R26 VB7.1 Tecnomatix Process Designer/Simulate<P>Win7 64bit Office 2016
|
erstellt am: 11. Aug. 2015 07:17 <-- editieren / zitieren --> Unities abgeben: Nur für tberger
|