Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
' schrieb:Was soll das heißen, mit was RICHTIGEN progra....
prograMMIEREN !
Mit LV kann das jeder, hier ein VI, da ein Wirechen, dort ein Schieberegister.
Mit textbasiert wird das mal so werden wie mit Gemüseanbau. Wer baut schon sein Gemüse noch selbst an. Es sei denn er will echte Pastinaken, dann muss er auch das Handwerk des Gemüsegärtners beherrschen.
(Man ist mir das wieder gut eingefallen)
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Anzeige
31.10.2007, 21:19 (Dieser Beitrag wurde zuletzt bearbeitet: 31.10.2007 21:20 von IchSelbst.)
Muss ich die beiden VIs "Sendonekey" und "Sendonekeycombi" miteinander verbinden? Denn im neuen Sendonekeycombi gibts jetzt nur noch Enums mit "Alt, Ctrl, Shift und noch einer..." da fehlen dann eben die F1-F12 Tasten.
Und: Wo kann ich einstellen, dass die Tasten dann für 3,5 Sekunden gedrückt bleiben? Mit nem Takt bestimme ich ja nur die zeitliche Periode, wann sie gedrückt werden...aber die Dauer des gedrückten Zustands kann ich so ja nicht einstellen, oder?
' schrieb:Muss ich die beiden VIs "Sendonekey" und "Sendonekeycombi" miteinander verbinden?
Nein.
Wenn, dann benutzt du nur SendOneKeyCombi. Dieses Unterprogramm hat vier gleiche Parameter: C1 bis C4, alle vier vom Typ U8. Der Wert eines jeden Parameters entspricht dem VK-Controlcode einer Taste. Diese vier Tasten werden der Reihe nach - C1 bis C4 - gedrückt und wieder losgelassen. Losgelassen aber in der Reihenfolge C4 bis C1.
Zitat:Denn im neuen Sendonekeycombi gibts jetzt nur noch Enums mit "Alt, Ctrl, Shift und noch einer..." da fehlen dann eben die F1-F12 Tasten.
Mach sie halt rein.
Das Teil ist kein "Enumerator", sondern ein "Ring" - und das Teil kann man erweitern! Bei einem Ring kann man dem Bezeichner zusätzlich auch noch einen expliziten Wert zuweisen (das eben geht bei Enums nicht). Welchen Wert du für F1 bis F12 oder sonst einer Taste setzen musst, dafür kuckst du den Link an, den ich angegeben habe.
Zitat:Und: Wo kann ich einstellen, dass die Tasten dann für 3,5 Sekunden gedrückt bleiben?
Du willst die Taste gedrückt lassen?
Mit dem Unterprogramm SendOnKeyCombi kannst du Tasten nur drücken - drücken heißt aber hinlänglich auch wieder loslassen. Für gedrückt lassen müsste ich noch was schreiben.
Wem willst du denn die Tasten überhaupt senden? Der eigenen Applikation (also dem eigenen Prozess) oder einen anderen Prozess?
Zitat:aber die Dauer des gedrückten Zustands kann ich so ja nicht einstellen, oder?
Wenn dann tust du die Tasten mit dem Unterprogramm in der DLL sowieso nur drücken. Loslassen nach Zeit müsstest du selbst machen.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Wenn die Tasten nicht mehr losgelassen werden sollen, dann den Mode "Loslassen" wegnehmen. Nichtsdestoweniger kann man eine Taste an eine Applikation senden alleine nur indem man sie drückt und nicht mehr loslässt.
Aber Vorsicht:
Man kann mit SendInput (und was anderes gibts - von mir - nicht) merkwürdige Effekte erziehlen, wenn die Taste nicht mehr losgelassen wird. Das geht soweit, dass im Explorer das Markieren nicht mehr funktioniert.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Wenn die Tasten nicht mehr losgelassen werden sollen, dann den Mode "Loslassen" wegnehmen. Nichtsdestoweniger kann man eine Taste an eine Applikation senden alleine nur indem man sie drückt und nicht mehr loslässt.
Aber Vorsicht:
Man kann mit SendInput (und was anderes gibts - von mir - nicht) merkwürdige Effekte erziehlen, wenn die Taste nicht mehr losgelassen wird. Das geht soweit, dass im Explorer das Markieren nicht mehr funktioniert.
Hm, sobald ich einen Wert in die Ring-Konstante zB C1 hinzufügen will (Rechte Maustaste - Eigenschaften - Objektbearbeiten - Wert hinzufügen - Name: VK_F5 - Wert: 74 (laut Link) und auf OK klicke stürzt mir das Programm ab...is der Fehler bekannt? Wie kann ich den umgehen?
01.11.2007, 19:41 (Dieser Beitrag wurde zuletzt bearbeitet: 01.11.2007 19:43 von IchSelbst.)
' schrieb:Hm, sobald ich einen Wert in die Ring-Konstante zB C1 hinzufügen will (Rechte Maustaste - Eigenschaften - Objektbearbeiten - Wert hinzufügen - Name: VK_F5 - Wert: 74 (laut Link) und auf OK klicke stürzt mir das Programm ab...is der Fehler bekannt?
LV in Version 8.2.0 stürzt ab? Ja, dieser Fehler ist bekannt. Kuckst du hier im Forum.
Zitat:Wie kann ich den umgehen?
Updaten auf LV8.2.1
Solange du noch kein LB8.2.1 hast, lässt du den Ring einfach weg und gibtst den Wert 74 (beachte: 74 Hex oder 74 decimal) direkt an.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
OK, also ich kriegs jetzt hin zB F5 an eine Anwendung (je nachdem welche aktiv ist) zu senden. Im Texteditor beispielsweise wird alle 10ms F5 gedrückt und so ein Zeitstempel eingefügt. Aber ich erkenne keinen unterschied zwischen Mode_none und Mode_loslassen. Wenn ich Mode_none ausgewählt habe, müsste eigentlich egal sein, was für ne Zeit in der Ereignisstrukur drinnen steht und er müsste mir zumindest einmal permanent auf F5 drücken, sodass sehr schnell viele Zeitstempel eingefügt werden. Dem ist aber nicht so...schreib ich 1000ms in die Ereignisstruktur, dann macht er jede Sekunden einen Zeitstempel, schreib ich 10ms rein, alle 10ms...aber das permanente Drücken der Taste bleibt aus, da ich das zumindest bei 1000ms registrieren sollte, dass er auf der Taste F5 bleibt, denn da werden die Zeitstempel normalerweise viel schneller eingefügt als jede Sekunden einer...
Klar was ich meine? ^_^
Nochmal vielleicht was ich eigentlich benötige:
Es soll an eine Anwendung alle 10ms für genau 3,5sec. der Tastendruck (ALT und F4) geschickt werden. Die Anwendung schließt sich dadurch nicht, deshalb soll das in einer Endlosschleife stattfinden.
Also:
0ms: ALT-F4 wird gedrückt
3500ms: ALT-F4 wird losgelassen (dazwischen darf es keine Unterbrechung geben)
3510ms: ALT-F4 wird gedrückt
7010ms: ALT-F4 wird losgelassen
usw.
Vielleicht sitz ich auch einfach nur auf der Leitung ^^ Kann sein, nach 3 Monaten LabVIEW Entzug ^^
' schrieb:Aber ich erkenne keinen unterschied zwischen Mode_none und Mode_loslassen.
Da wirst du auch keinen Unterschied feststellen. Und zwar deswegen:
Das mit dem "eine Taste eingeben in einer Anwendung" funktioniert ungefähr so: Beim Drücken der Taste wird eine Windows-Message an die aktuelle Anwendung (das ist für gewöhlich die, deren Titelleiste aktiviert ist) gesendet, mit dem Inhalt "Taste X gedrückt" (WM_KeyDown). Bleibt die Taste gedrückt, wird nichts gesendet. Wird die Taste wieder losgelassen, sendet das Betriebssystem WM_KeyUp an die Anwendung. Die Anwendung stellt also im Normalfall nicht selbstständig fest, ob eine Taste noch immer als gedrückt gilt. Zwar gibt es auch hierfür Möglichkeiten (GetAsyncKeyState, GetKeyboardState etc.), aber die benutzt wahrscheinlich keine Anwendung.
Wenn du meinst, dass eine Taste ständig an die Anwendung gesendet wird, solange sie gedrückt bleibt, dann tritt hier die Key-Pepeat-Funktion des Betriebsystems ein. Dann wird eben in einem bestimmten Raster WM_KeyDown (und möglicherweise WM_KeyUp) vom Betriebssystem an die Anwendung gesendet.
Zitat:Wenn ich Mode_none ausgewählt habe, müsste eigentlich egal sein, was für ne Zeit in der Ereignisstrukur drinnen steht und er müsste mir zumindest einmal permanent auf F5 drücken
Eben so ist es nicht. Die von mir verwendete Funktion SendInput habe ich bisher nicht so programmiert, dass die automatische Repeatfunktion aktiviert ist. Selbst wenn ich das machen würde, müsstest du nach 3500ms die Taste loslassen. Du kommst also nicht umhin entweder alle 10ms zu senden mit eine Pause nach 3500 oder zum Zeitpunkt 3500 einmal Loslassen und 10ms stäter wieder drücken. Sollte sowas eine DLL machen, müsste die mehr Eigenintelligenz haben als die, die ich geschrieben habe.
Zitat:Es soll an eine Anwendung alle 10ms für genau 3,5sec. der Tastendruck (ALT und F4) geschickt werden.
Dass die Sache mit 10ms pro Tastendruck so funktioniert, da hab ich doch so meine Zweifel.
Zitat:0ms: ALT-F4 wird gedrückt
3500ms: ALT-F4 wird losgelassen (dazwischen darf es keine Unterbrechung geben)
3510ms: ALT-F4 wird gedrückt
7010ms: ALT-F4 wird losgelassen
usw.
Wie stellt denn deine Anwendung fest, dass die Taste für 3500ms gedrückt ist?
Das würde sie nur mittes GetAsyncKeyState etc machen können - und zwar mit einem Abtastraster von z.B. 1ms. Alleine durch feststellen, dass im Raster von z.B. 10ms eine Taste ankommt kann prinzipiell nicht festgetsellt werden, ob die Taste dauernd gedrückt ist, ober ob sie im Raster von 10ms gedrückt und wieder losgelassen wird. Du schreibst, dass die Taste im Bereich von 3500 bis 3510 losgelassen ist. Bei einem gerasterten Senden alle 10ms kann dieses Loslassen aber nicht festgestellt werden. So wie du das hier schreibst, solltest du mit der bisheriegen Funktionalität meiner DLL auskommen. Ich gehe aber davon aus, dass deine Anwendung die gedrückten Tasten registriert und nicht den Tastaturstatus abfragt.
Möglicherweise funktioniert deine Anwendung wie folgt: Sie erwartet ganz einfach alle 10ms (+-5ms) einen Tastendruck. Damit entsteht ein Raster von 10ms. Nach 3500ms fehlt nun genau ein Rasterpunkt - dadurch wird der von dir gewünschte Effekt - Pause zwischen 3500ms und 3510ms - erreicht.
Du hast jetzt folgende Möglichkeiten:
1) Mach ein SubVI mit hoher Priorität. Durch die hohe Priorität wird das Raster von 10ms garantiert eingehalten. Im SubVI sendet du alle 10ms einen Tastendruck Alt-F4 - einschließlich loslassen. Nach 3500ms - also nach 350 gesendeten Tasten - lässt du einmal Senden aus.
2) Du kuckst bei ni.com ob du was entsprechendes findest.
3) Du wartest, bis mir was eingefallen ist.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Ich schlage von die Methode mit dem hoch-priorisierten SubVI zu verwenden. Das mit dem Parameter Time bei SendInput (guckst du PSDK) geht irgendwie nicht auf Anhieb. Ich hab dir jetzt eine Funktion reingemacht, damit kannst du allen machen, was mit SendInput möglich ist (außer ExtraInfo, was nicht geht, weils ein Pointer ist).
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).