| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung
|
Autor
|
Thema: Leertaste unterdrücken (1698 mal gelesen)
|
DerBrain87 Mitglied Mathematiker
Beiträge: 86 Registriert: 29.04.2015 Inventor 2021 & VisualStudio 2017
|
erstellt am: 17. Dez. 2015 11:50 <-- editieren / zitieren --> Unities abgeben:
Hallo liebes Forum, Vor kurzem habe ich begonnen ein AddIn für Inventor zu schreiben. Nach längerer Recherche und etwas rumärgeren hat das AddIn auch gemacht was es sollte, nämlich über ein Button in der Ribbon ein Formular öffen. Der Aufruf der Form erfolgt über: Code:
Public Sub mBD_Click(ByVal Context As Inventor.NameValueMap) Handles mBD.OnExecute Try dim param() as object = ermittleParameterFuerDasForm() Dim frm As New frmiPropertyEditor(param) frm.Show() Catch ex As Exception MsgBox(ex.ToString(), MsgBoxStyle.Critical, "Unbehandelter Fehler") End Try End Sub
Ich habe mich absichtlich für .Show() und nicht .ShowDialog() entschieden, da der Benutzer weiterhin in Inventor arbeiten können sollen. Nun mein Problem: In meinem Formular sind mehrere Textboxen beinhaltet in denen ein Benutzer Daten eingeben kann. Dummerweiße meint Inventor, sobald der Benutzer die Leertaste drückt, dass es den letzten Befehl wiederholen soll. Hat mein Formular den Fokus, ist die Warscheinlichkeit, dass das gedrückte Leerzeichen in eine Textbox gehört, jedoch wesentlich höher wie dass Inventor gemeint ist. Daher soll Inventor von Leerzeichen die gedrückt wurden, solange mein Formular den Fokus hat doch bitte nichts von mitbekommen. - Lieder weiß ich nicht genau, wie ich das meinem AddIn und Inventor beibringen soll:-( Vor langer Zeit beschäftigte ich mich mal mit dem Abfangen von Windows-Events (was der KeyPress des Leerzeichen ja auch sein müsste). Leider ist es zulange her, bezog sich nur auf das Mausrad und war in VB6. Zudem bin ich mir auch nicht sicher, ob das der richtige Weg ist/wäre.
Vielen Dank im Vorraus DerBrain87
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Chris 31 Mitglied Konstrukteur und Mädchen für alles
Beiträge: 575 Registriert: 23.04.2013 Inventor 2015 Professional Windows 7 64 bit 16GB RAM nVidia Quadro 600
|
erstellt am: 21. Dez. 2015 07:45 <-- editieren / zitieren --> Unities abgeben: Nur für DerBrain87
Ich hab hier mal was. In die Form ein zu tragen: Code: Private Sub Form_keydown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown If e.KeyCode = Windows.Forms.Keys.Space Then 'hier irgendwas tun... End If End Sub
------------------ MFG Chris Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DerBrain87 Mitglied Mathematiker
Beiträge: 86 Registriert: 29.04.2015 Inventor 2021 & VisualStudio 2017
|
erstellt am: 21. Dez. 2015 09:49 <-- editieren / zitieren --> Unities abgeben:
Nope, dass ist es leider nicht. Das Event KeyDown mit e.KeyCode = Keys.Space kommt nicht mal im Formular an. :-( Soll heißen, wenn ich "'hier irgendwas tun..." einfach durch msgbox("") ersetze, geht nichtmal die Box auf... Erschwerend kommt ja noch dazu, dass ich, wenn die Leertaste gedrückt wird nicht wirklich etwas tun möchte - ich möchte lediglich, dass Inventor nicht seinen letzten Befehl wiederholt und das Leerzeichen genau das macht, was es eben macht, wenn das Formular via showDialog geöffnet wird. Sry, falls meine ursprüngliche Frage diesbezüglich evtl. etwas verwirrend formuliert war. Gruß DerBrain87
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Chris 31 Mitglied Konstrukteur und Mädchen für alles
Beiträge: 575 Registriert: 23.04.2013 Inventor 2015 Professional Windows 7 64 bit 16GB RAM nVidia Quadro 600
|
erstellt am: 21. Dez. 2015 12:00 <-- editieren / zitieren --> Unities abgeben: Nur für DerBrain87
|
DerBrain87 Mitglied Mathematiker
Beiträge: 86 Registriert: 29.04.2015 Inventor 2021 & VisualStudio 2017
|
erstellt am: 21. Dez. 2015 13:52 <-- editieren / zitieren --> Unities abgeben:
Funktioniert bei mir nahezu einwandfrei - mit Ausnahme der Leertaste (und Enter-Taste wie ich seit neuestem festgestellt habe). Ich habe mal weiter geforscht, ob ich die selben Probleme mit 'q', 'r', 'm', 's' etc. (also den Buchstaben die ohne Kombination mit 'Alt' oder 'Strg' ein Inventor-Shortcut sind) haben. Was mich total überrascht hat: Die Antwort lautet Nein. Ich kann jeden beliebigen Buchstabe ohne Einschränkungen in meine Form klatschen. Gruß DerBrain87 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Chris 31 Mitglied Konstrukteur und Mädchen für alles
Beiträge: 575 Registriert: 23.04.2013 Inventor 2015 Professional Windows 7 64 bit 16GB RAM nVidia Quadro 600
|
erstellt am: 22. Dez. 2015 07:20 <-- editieren / zitieren --> Unities abgeben: Nur für DerBrain87
Solange deine Form nicht den Focus hat, kann die msgbox auch nicht erscheinen. Du müsstest die "Befehlswiederholfunktion" von Inventor ausschalten um dein Problem zu beheben. Ich habe aber keine Einstellung finden können, in der man das ausstellen könnte. Alternative wäre nur die Form eben doch über .showDialog einblenden, nachdem die erforderlichen Arbeiten im Inventor gemacht wurden. ------------------ MFG Chris Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DerBrain87 Mitglied Mathematiker
Beiträge: 86 Registriert: 29.04.2015 Inventor 2021 & VisualStudio 2017
|
erstellt am: 22. Dez. 2015 07:38 <-- editieren / zitieren --> Unities abgeben:
Die Idee mit dem "Befehlswiederholfunktion ausschalten" hatte ich auch schon - aber ebenfalls leider nichts gefunden:-( Ebenso ist mir durchaus bewusst, dass die Notlösung .showDialog ist (so hab ich es momentan an meine Mitarbeiter auch verteilt). Meine Hoffnung war, dass ich (da das ausschalten nicht existiert) über API oder so, mir gready das KeyPress-Event in meine Form hole. Hier würde ich dann gern überprüfen ob die Leertaste gedrückt wurde. Wenn nicht, soll das Event einfach weitergereicht werden. Wenn der KeyPress die Leertaste war und die Form den Fokus hat (das sollte ich ja via Me.hasFocus oder sowas ermitteln können) würde ich gern für die anderen Anwendungen die auf ein KeyPress-Event warten (hauptsächlich Inventor) selbiges gern schlucken. Liegt ich hier mit meiner Idee im nicht realisierbaren? Gruß DerBrain87 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570 Laptop: Alienware m17x Win7, Inventor2012
|
erstellt am: 22. Dez. 2015 09:05 <-- editieren / zitieren --> Unities abgeben: Nur für DerBrain87
Guten Morgen. Mach eine Klasse clsWindowWrapper.cs und kopiere folgenden Inhalt rein: Code:
using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace InventorToolBox { /// <summary> /// Contains all properties, events and methods necessary to convert a window handle to a IWin32Window /// </summary> public class clsWindowWrapper : System.Windows.Forms.IWin32Window { #region Private members private IntPtr _hwnd; #endregion #region Constructors /// <summary> /// Creates a new instance of the window wrapper class /// </summary> /// <param name="WindowHandle">Represents the window handle necessary to obtain the IWin32Window</param> public clsWindowWrapper(IntPtr WindowHandle) { //Assign arguments _hwnd = WindowHandle; } /// <summary> /// Creates a new instance of the window wrapper class /// </summary> /// <param name="WindowHandle">Represents the window handle number necessary to obtain the IWin32Window</param> public clsWindowWrapper(int WindowHandle) { //Assign arguments _hwnd = new IntPtr(WindowHandle); } #endregion #region Properties /// <summary> /// Gets the window handle /// </summary> public IntPtr Handle { get { return _hwnd; } } #endregion } }
In dem StandardAddInServer.cs erstellst du ein Feld und einen Accessor: Code:
static IWin32Window _invMainFrame = null; public static IWin32Window InvMainFrame { get { if (_invMainFrame == null) { _invMainFrame = new clsWindowWrapper((System.IntPtr)InvApp.MainFrameHWND); } return _invMainFrame; } }
Deine Form rufst du nun mit: Code:
Form myForm = new Form(); myForm.Show(InvMainFrame);
Nein, ich übersetze das nicht ins VB.NET. ------------------ Grüße Igor FX64 Software Solutions - Inventor Tools FX64 LambdaSpect - Lichtsimulation mit Autodesk Inventor Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DerBrain87 Mitglied Mathematiker
Beiträge: 86 Registriert: 29.04.2015 Inventor 2021 & VisualStudio 2017
|
erstellt am: 08. Jan. 2016 10:03 <-- editieren / zitieren --> Unities abgeben:
Hallo und gutes neues Jahr erstmal:-) Das sieht schon verdammt hübsch aus! Erstmals vielen Dank. Fast hätte ich dein Zitat: Nein, ich übersetze das nicht ins VB.NET.
überlesen^^ Ich müsste dein tollen - ich denke C#-Code? - ja 1:1 ins VB.NET übersetzen können, oder? Gruß DerBrain87 p.s. wenn du mir jetzt noch mein "'Nur Rasteransicht' deaktivieren"-Problem lösst bist du mein Gott:-)
[Diese Nachricht wurde von DerBrain87 am 08. Jan. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DerBrain87 Mitglied Mathematiker
Beiträge: 86 Registriert: 29.04.2015 Inventor 2021 & VisualStudio 2017
|
erstellt am: 08. Jul. 2021 10:11 <-- editieren / zitieren --> Unities abgeben:
was lange währt wird endlich gut:-) Ich muss gestehen, ich hatte dieses Problem schon ganz vergessen, da ich damals eine Notlösung gefunden hatte. Heute habe ich an einer anderen Stelle das gleiche Problem bekommen und mich an diesen Thread erinnert. In dem aktuellen Fall konnte ich die Notlösung mit ShowDialog nicht gebrauchen. Der Code von daywa1k3r hat bis auf zwei Kleinigkeiten wunderbar funktioniert. Da ich diese Funktion allgemein sehr nützlich finde, habe ich mich entschlossen, diesen Beitrag nach so langer Zeit als erfolgreich erledigt zu markieren. Folgende Anpassungen musste ich (neben der Übersetzung nach VB.NET) vornehmen:
- Der Cast beim Erzeugen des Wrapper-Objekts ist weggefallen. InvApp.MainFrameHWND gibt (zumindest bei VB.NET) einen Integer zurück. Da in dieser Wrapper-Klasse ein Konstruktor für Integer vorhanden ist, habe ich auf den Cast verzichten können.
Code: _invMainFrame = new clsWindowWrapper((System.IntPtr)InvApp.MainFrameHWND); // Alt _invMainFrame = new clsWindowWrapper(InvApp.MainFrameHWND); //Neu
- Das Feld _invMainFrame sowie sein Accessor funktionierten nicht als Static (bzw. Shared in meinem Fall) Nachdem ich das Shared (bzw. Static) entfernt habe hats einwandfrei funktioniert In diesem Falle nochmals herzlichen Dank an alle die mir geholfen haben und explizit an daywa1k3r! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bietus Mitglied Konstrukteur
Beiträge: 1 Registriert: 24.03.2024
|
erstellt am: 24. Mrz. 2024 12:25 <-- editieren / zitieren --> Unities abgeben: Nur für DerBrain87
ACHTUNG! Sie antworten auf einen Beitrag der älter als 1 Jahr ist!
Zitat: Original erstellt von DerBrain87: was lange währt wird endlich gut:-) Ich muss gestehen, ich hatte dieses Problem schon ganz vergessen, da ich damals eine Notlösung gefunden hatte. Heute habe ich an einer anderen Stelle das gleiche Problem bekommen und mich an diesen Thread erinnert. In dem aktuellen Fall konnte ich die Notlösung mit ShowDialog nicht gebrauchen. Der Code von daywa1k3r hat bis auf zwei Kleinigkeiten wunderbar funktioniert.Da ich diese Funktion allgemein sehr nützlich finde, habe ich mich entschlossen, diesen Beitrag nach so langer Zeit als erfolgreich erledigt zu markieren. Folgende Anpassungen musste ich (neben der Übersetzung nach VB.NET) vornehmen:
- Der Cast beim Erzeugen des Wrapper-Objekts ist weggefallen. InvApp.MainFrameHWND gibt (zumindest bei VB.NET) einen Integer zurück. Da in dieser Wrapper-Klasse ein Konstruktor für Integer vorhanden ist, habe ich auf den Cast verzichten können.
Code: _invMainFrame = new clsWindowWrapper((System.IntPtr)InvApp.MainFrameHWND); // Alt _invMainFrame = new clsWindowWrapper(InvApp.MainFrameHWND); //Neu
- Das Feld _invMainFrame sowie sein Accessor funktionierten nicht als Static (bzw. Shared in meinem Fall) Nachdem ich das Shared (bzw. Static) entfernt habe hats einwandfrei funktioniert In diesem Falle nochmals herzlichen Dank an alle die mir geholfen haben und explizit an daywa1k3r!
Hallo und guten Tag. Ich habe mit großem Interesse des Thread gelesen. Ich habe zZt. das gleiche Problem mit Enter und Leertaste bei Inventor. Ich programmiere ebenfalls in VB.Net, jedoch scheitere ich an der Übersetzung des C-Codes. Besteht die Möglichkeit, die Implementierung aus deiner Lösung einsehen zu dürfen? Das würde mich echt nach vorne bringen. Jetzt schon mal vielen Dank... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bwr Mitglied Konstrukteur
Beiträge: 139 Registriert: 21.02.2007 Win10 64-bit NVIDIA T500 Inventor 2022 Catia V5-6R2020
|
erstellt am: 28. Mrz. 2024 21:25 <-- editieren / zitieren --> Unities abgeben: Nur für DerBrain87
Hallo bietus, das ist jetzt keine 1:1 Übersetzung, obwohl ich in VB.Net und C# programmiere. Außerdem ist der Code nicht von mir, sondern ab ich mal aus einer Vorlage von Brian Ekins gezogen. Code:
Public Class WindowWrapper ' This class is used to wrap a Win32 hWnd as a .Net IWind32Window class. ' This is primarily used for parenting a dialog to the Inventor window. ' This provides the expected behavior when the Inventor window is collapsed ' and activated. ' Von Brian Ekins AddinTemplate bzw. AdWebServicesBug ' ' For example: ' myForm.Show(New WindowWrapper(inventorApplication.MainFrameHWND)) Implements System.Windows.Forms.IWin32Window Public Sub New(ByVal handle As IntPtr) _hwnd = handle End Sub Public ReadOnly Property Handle() As IntPtr _ Implements System.Windows.Forms.IWin32Window.Handle Get Return _hwnd End Get End Property Private _hwnd As IntPtr End Class
Ich hoffe das hilft dir schon mal weiter ------------------ Grüße Andreas etaCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |