Öfters gibt es ja das problem, dass man zwischen ins Leere Clicken und rechte Maustaste unterscheiden möchte.
Leuider gint ja entsel in beiden Situationen das gleiche zurück. Ich habe mir jetzt überlegt, ob man nicht einfach nach entsel einfach die rechte Maustaste abfrägt, da ja die Warscheinlichkeit, dass der Benutzer nur eine 1/1000 sek lang die rechte Maustatse drückt sehr gering ist.
Leider habe ich nur mittels Windows API eine Möglichkeit gefunden die rechte Maustaste abzufragen
Hier mal mein Testweise Konstrukt
Die Funktion bleibt solange in einer Abfrageschleife, bis der Benutzer ein Objekt wählt, mit der rechten Maustatse abbricht oder mit ESC Abbricht.
Clickt er ins Leere, bleibt die Funktion in der Abfrageschleife
Ich würde euch bitten, das Dingens mal auf verschioedenen Rechnern zu testen, und mir Bescheid geben, obs auf verschiedenene Umgebungen auch wirklich zuverlässig funktioniert.
(defun MyEntsel (/)
(setq ok nil)
(while (not ok)
(setq ret (try 'entsel '()))
(cond ; Objekt gewählt
((= (type ret) 'LIST) (setq ok t))
; rechte Maustaste oder ins Leere ergibt durch TRY True
((= ret t)
(vl-vbarun "RightMouseButton") ; schauen ob rechte Maustatse gedrückt ist
(if (= (getvar "USERI1") 1)) (setq ok t ret nil)
)
; ESC -> ABBruch durch TRY wird ein fehler ja zu NIL
((= ret nil) (setq ok t))
)
)
ret
)
;------------------------------------------------------------------------------
; Testroutine ergibt nil im Fehlerfall ansonst den Rückgabewert der zu
; testenden Funktion
; ist der Rückgabewert der Funktion auch im Erfolgsfall nil
; wird t zurückgegeben
;
; (try '+ (list 1 2 3 4 5 6)) ergibt 21
; (try '/ (list 5 0)) ergibt nil
;------------------------------------------------------------------------------
(defun Try ( func arg / a1 a2 )
(setq a2 (vl-catch-all-error-p (setq a1 (vl-catch-all-apply func arg))))
(cond (a2 nil)
(a1 a1)
(t t)
)
)
un weiters benötigt man in VBA ein Modul, das folgendermassen ausschaut.
Private Declare Function GetAsyncKeyState Lib "user32.dll" ( _
ByVal vKey As Long) As Integer
Private Const VK_RBUTTON = &H2
Private Const VK_LBUTTON = &H1
Sub RightMouseButton()
If GetAsyncKeyState(VK_RBUTTON) And 1 = 1 Then
Call ThisDrawing.SetVariable("USERI1", 1)
Else
Call ThisDrawing.SetVariable("USERI1", 0)
End If
End Sub
------------------
Ing. Anton Fuchs
WWW.FFZELL.AT.TC
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP