Editfeld behält Focus bzw gedrückte linke Maustaste ? Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Elektroschrauber

Editfeld behält Focus bzw gedrückte linke Maustaste ?  Topic is solved

04 Feb 2019, 01:57

Moin an alle,

ich möchte das mein Skript beim Klick in die Editierzeile den Inhalt an die letzte Cursorposition einfügt.
Jetzt sind mir aber 2 Besonderheiten beim erstellen des Skriptes aufgefallen.
1. wenn ich nach klick ein SEND ausführen lassen , behält diese Zeile den Zustand gedrückte Linke Maustaste und ich kann auch wenn ich in einem anderen Fenster gearbeitet habe, wieder ins Editfeld gehen und je nach Mausposition werden mehr oder weniger Zeichen markiert.
2. wenn ich TOOLTIP nutze tritt das gleiche Phänomen auf.

Liegt es vielleicht an der Methode?

Code: Select all

OnMessage(0x201, "WM_LBUTTONDOWN")
Und wenn ja gibt es eine bessere? Ein WM_LBUTTONCLICK habe ich nicht gefunden

Ich habe das jeweils für Zeile 3 SENDund Zeile 4 TOOLTIP zum testen hinterlegt.

Jemand eine Idee oder Anregung?

Hier jetzt der Code:

Code: Select all

;noch im werden

; zu tun:
; - doku des codes
; - gebrauchanweisung
; - klick auf (edit) zeile soll inhalt in letzter Anwendung an Cursor stelle einfügen

#SingleInstance

Gui, +AlwaysOnTop
Gui, Add, Edit, vclip1 ReadOnly HWNDhedit1 W180, Placeholder1
Gui, Add, Edit, vclip2 ReadOnly HWNDhedit2 W180, Placeholder2
Gui, Add, Edit, vclip3  W180 HWNDhedit3, 012345678901234567890
Gui, Add, Edit, vclip4 ReadOnly W180 HWNDhedit4, Placeholder4
Gui, Add, Button, gButtonOk , ok			; für testzwecke
Gui, Show, X1600 Y0
OnMessage(0x201, "WM_LBUTTONDOWN") ; 0x201 = lbuttondown

;OnMessage(0x1C, "WM_first") ; nur zum testen 0x200 = mousemove first
								;WM_MOUSELEAVE = 0x2A3
								;OnMessage(WM_ACTIVATEAPP := 0x1C, "OnActivate")
OnClipboardChange("ClipChanged")


return


~LButton::
	MouseGetPos, xpos1, ypos1 
return
												; und automatisch kopieren 
~LButton Up::
	MouseGetPos, xpos2, ypos2  
 	if ( (xpos1 - xpos2 <> 0) or (ypos1-ypos2 <> 0))
	{
		Send ^c
	}
return



ButtonOk:  ; nur zu testzwecken
 

WinGetActiveTitle, Title
WinHide %Title%
send hello
WinShow %Title%

return

ClipChanged(Type) {
	
	GuiControlGet,zwischen,, clip3
	guicontrol,, clip4, %zwischen%
	GuiControlGet,zwischen,, clip2
	guicontrol,, clip3, %zwischen%
	GuiControlGet,zwischen,, clip1
	guicontrol,, clip2, %zwischen%
	
	
	guicontrol,, clip1, %clipboard%
	
    ;ToolTip Clipboard data type: %Type%
   ; Sleep 1000
   ; ToolTip  ; Turn off the tip.
}

WM_first(wParam, lParam,msg, hwnd) ; testzwecken
{
; WinGet Last, ID
; WinActivate ahk_id %Last%
;msgbox % DllCall("GetForegroundWindow")
    ToolTip Clipboard data type: %Type%
    Sleep 1000
    ToolTip  ; Turn off the tip.
}

WM_LBUTTONDOWN(wParam, lParam,msg, hwnd )
{
	global

 if (hwnd = hedit2)  {
    
	;PostMessage, 0xB1, 0, -1,, ahk_id %hedit2% ; 0xB1 = EM_SEL < -- woher?
	GuiControlGet,zwischen,, clip2
	clipboard = %zwischen%
	
	;send ^v

  }

  if (hwnd = hedit3)  {
    
	;PostMessage, 0xB1, 0, -1,, ahk_id %hedit3% ; 0xB1 = EM_SEL < -- woher?
	GuiControlGet,zwischen,, clip3
	WinGetActiveTitle, Title
;	WinHide %Title%
	send %zwischen%
;	WinShow %Title%
;	PostMessage, 0xB1, 0, -1,, ahk_id %hedit3% ; 0xB1 = EM_SEL < -- woher?
  }
  
   if (hwnd = hedit4)  {
    
	ToolTip hallo %hwnd%
    Sleep 100
    ToolTip  ; Turn off the tip.
	
	;PostMessage, 0xB1, 0, -1,, ahk_id %hedit4% ; 0xB1 = EM_SEL < -- woher?
	;WinActivate
	
  }

	;ToolTip hallo %hwnd%
    ;Sleep 100
    ;ToolTip  ; Turn off the tip.

}


GuiClose:
ExitApp
just me
Posts: 9449
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Editfeld behält Focus bzw gedrückte linke Maustaste ?

04 Feb 2019, 04:49

Moin,
... ich möchte das mein Skript beim Klick in die Editierzeile den Inhalt an die letzte Cursorposition einfügt.
Ich verstehe Deine Fragen vielleicht nicht richtig. Bei Klick in welche Editierzeile soll der Inhalt (der Zwischenablage?) an welcher Cursurposition eingefügt werden?

Du nutzt gleichzeitig zwei verschiedene Methoden, um einen linken Mausklick abzufangen:
  1. OnMessage(0x201, "WM_LBUTTONDOWN") (Mausnachricht)
  2. ~LButton:: / ~LButton Up:: (Hotkeys)
Warum machst Du das?

Hier sieht es so aus, als ob die Up Hotkeyroutine die Mausfunktion unterbrechen kann. Möglicherweise gerät die Verarbeitungsreihenfolge der Mausnachrichten dabei durcheinander.
Elektroschrauber

Re: Editfeld behält Focus bzw gedrückte linke Maustaste ?

04 Feb 2019, 07:48

interessanter Hinweis.

Die Hotkeys sorgen dafür, dass beim markieren der Text in die Zwischenablage kopiert wird. Die if abfrage im Hotkey, sodass wirklich nur wenn die Maus auch bewegt wurde.
Bisher dachte ich, dass die Tilde ~ dafür sorgt, dass die normale Hotkeyfunktion trotzdem ungehindert stattfindet.

Ich meine die Editierzeile aus meiner Gui heraus. Dieser Inhalt soll an die Cursorposition eingefügt werden.
Wenn ich beispielsweise hier Tippe, klicke ich auf die 3. Editierzeile und der Defaultwert 0123456789.... wird eingefügt.
just me
Posts: 9449
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Editfeld behält Focus bzw gedrückte linke Maustaste ?

04 Feb 2019, 11:28

Die Tilde ~ sorgt tatsächlich dafür, dass der Mausklick auch ausgeführt wird. Allerdings sind die Hotkeys nicht kontextabhängig. Die Routinen werden deshalb bei jedem Klick 'wo auch immer' aufgerufen. Die Mausnachricht WM_LBUTTONDOWN kommt aber nur dann, wenn tatsächlich auf dem Clientbereich des AHK-Fensters geklickt wurde.

Wenn Du per Send Anweisung irgendwo Text einfügen willst, muss dieses irgendwo den Eingabefokus haben. Wenn Du aber dafür auf das AHK-Fenster klickst, bekommt das im selben Augenblick den Eingabefokus. Die Send Anweisung richtet sich dann an das eigene Fenster.
Elektroschrauber

Re: Editfeld behält Focus bzw gedrückte linke Maustaste ?

05 Feb 2019, 00:22

da sagst mir nichts neues.

winhide und winshow sorgen allerdings dafür, dass der inhalt genau landet wo es möchte. Habe gerade gesehen, dass ich auskommentiert habe. Spielt aber für meine Frage keine Rolle. Denn auch beim Tootltip wir das Gleiche verhalten gezeigt.

Ich hatte jetzt mal die Hotkeys auskommentiert. Da kommt das Gleiche verhalten. Wenn keine Aktion in der Editierzeile ausgeführt wird passiert auch nichts. Auch bei der der 2.Editierzeile, in der einfach der Inhalt in die Zwischenablage kopiert wird, zeigt nicht dieses verhalten.


PS: Danke soweit für die Anregungen und danke an den Moderator.
just me
Posts: 9449
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Editfeld behält Focus bzw gedrückte linke Maustaste ?

06 Feb 2019, 05:12

Moin,

ich habe Deinen Code (mit all den auskommentierten Stellen) jetzt durchgetestet. Ich gehe mal davon aus, dass Du die unterschiedlichen automatischen Hintergrundaktionen tatsächlich brauchst.

Das Problem mit der 'gehaltenen linken Maustaste' habe ich auch. Es sieht für mich so aus, als ob dem Skript die WM_LBUTTONUP (0x0202) Nachricht entgeht, wenn es noch mit der Verarbeitung der WM_LBUTTONDOWN (0x0201) Nachricht beschäftigt ist. Folglich bleibt die linke Maustaste für das Skript gedrückt.

Man kann das hart korrigieren, indem man eine WM_LBUTTONUP Nachricht selbst absetzt. Wenn in diesem Fall später noch eine zweite folgt, richtet die anscheinend keinen Schaden an.

Code: Select all

   If (hwnd = hedit3) {
      ; PostMessage, 0xB1, 0, -1,, ahk_id %hedit3% ; 0xB1 = EM_SEL < -- woher?
      GuiControlGet, zwischen, , clip3
      WinGetActiveTitle, Title
      ; WinHide %Title%
      Send, %zwischen%
      ; WinShow %Title%
      ; PostMessage, 0xB1, 0, -1,, ahk_id %hedit3% ; 0xB1 = EM_SEL < -- woher?
      DllCall("PostMessage", "Ptr", hwnd, "UInt", 0x0202, "Ptr", wParam, "Ptr", lParam) ; WM_LBUTTONUP
   }

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 23 guests