| Autor |
Beitrag |
biohazard
      
Beiträge: 89
|
Verfasst: Fr 20.06.03 09:04
Hallo,
habe da ein kleines Problem. Ich möchte, wenn ich den HotKey drücken den markierten Text aus einer anderen Anwendung an mein Prog übergeben. (Später soll sich das Wort noch selber markieren). Dabei gehe ich so vor, daß zu diesem Zeitpunkt das Handle ermittelt wird das unter dem Mousecursor ist. Der Rest wird über die Zwischenablage erledigt. Innerhalb meines Programmes funktioniert es aber mit anderen Progs nicht, obwohl ich das Handle der jeweiligen Komponente habe. Es wird erst gar nichts in die Zwischenablage kopiert. Warum nicht? Kann mir da jemand helfen.
Hier mal der Code zur Hilfe:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure TForm1.WMHotKey(Var Msg: TWMHotkey); var rPos: TPoint; hWnd: THandle; a:integer; b:string; begin case Msg.IdHotKey of ID: begin GetCursorPos(rPos); hWnd := WindowFromPoint(rPos); SendMessage(hwnd, WM_COPY, 0, 0); edit1.Text:=''; b:=edit1.text ; han:=findwindow(0,'Hossa'); hwnd2:=findwindowex(han,0,'TEdit',PAnsiChar(b)); SendMessage(hwnd2, WM_PASTE, 0, 0); end; ID+1: begin end; end; inherited; end; |
Moderiert von Tino: Delphi-Tags hinzugefügt.
|
|
Gast
Gast
Erhaltene Danke: 1
|
Verfasst: Mo 28.07.03 23:31
LOL, weil eine EXE nicht in den Speicher einer anderen EXE schreiben kann. Dementsprechend muessen wir eine DLL benutzen:
assarbad.net/stuff/tutorials/dll_tutorial/
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 29.07.03 02:27
Das gilt aber nicht für standard Kontrolls, wie Edits usw. Und muß es denn unbedingt über die Zwischenablage gehen? Der Anwender wird sich freuen, wenn sich der Inhalt auf mysteriserweise geändert hat. Versuch dein Glück mal mit WM_GETTEXT und WM_SETTEXT.
|
|
biohazard 
      
Beiträge: 89
|
Verfasst: Do 31.07.03 09:40
Hallo,
so funktioniert es. Bei manchen Komponenten aber nur wenn ich direkt in dem Feld bin. Eigentlich will ich ja nur den Text, der unter dem Cursor ist an mein Edit senden. Das muß doch zu schaffen sein.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| procedure TFRM_Connect.WMHotKey(Var Msg: TWMHotkey); var rPos: TPoint; hWnd: THandle; a,x:integer; b,s:string; begin case Msg.IdHotKey of ID: begin GetCursorPos(rPos); hWnd := WindowFromPoint(rPos); SendMessage(hWnd,EM_SETSEL,0,-1); SendMessage(hwnd, WM_COPY, 0, 0); edt_DS.Text:=''; b:=edt_DS.text ; HandleH:=findwindow('TFRM_Connect','Connector'); HandleN := edt_DS.Handle; edt_DS.Text:=''; SendMessage(HandleN, WM_PASTE, 0, 0); s:=edt_ds.Text; x := pos(' ',s); edt_ds.Text := copy(s,1,x); end; ID+1: begin end; end; inherited; end; |
Das mit WM_GETTEXT und WM_SETTEXT funktioniert irgendwie nicht oder besser gesagt ich bekomme es nicht hin.
|
|
Gast
Gast
Erhaltene Danke: 1
|
Verfasst: Do 31.07.03 09:57
Ist es auch. Per Hook, insofern der Benutzer nicht per gedrückter Maustaste ds Fenster auswählen soll. Zu Hooks findest du auf meiner Homepage ein hoffentlich gutes und ausführliches Tutorial.
|
|
biohazard 
      
Beiträge: 89
|
Verfasst: Do 31.07.03 13:54
@Assarbad
ein paar kleine Frage hab ich da noch. Wo in meinem Programm muß ich denn angeben wo ich die Info hinschreiben will.
in deinem Bsp.-Prog. (captain_hook) oder hier in dem Tut stehen die Zeilen:
Quelltext 1: 2:
| temp := code2string(getprop(hwnd, 'mous_ncode')); SetDlgItemText(hwnd, IDC_EDIT8, pchar(temp)); |
Wenn ich das richtig verstanden habe wird hier der Text an edit8 übergeben.
Da dein ganze Prog aber in NON-VCL ist, bin ich ein wenig überfordert da rauszukommen wo das passiert.
Wenn ich jetzt von meinem oben geschriebenen Quelltext ausgehe kann ich dann den Hook beim drücken der Tastenkombination aktivieren oder muß das vorher geschehen.
Ich hoffe mal ich habe mich verständlich ausgedrückt.
Ich krieg hier noch ne Krise. 
|
|
Gast
Gast
Erhaltene Danke: 1
|
Verfasst: Do 31.07.03 17:29
Hehe, also verstanden hab ich nicht, was du meinst. Hast du mein aktuellstes Tutorial (PDF) von meiner Seite genommen? Das bei Delphigroups ist nicht aktuell!
assarbad.net/stuff/t...rials/hooks/preview/
Der Code den du anfuehrst setzt in der Tat den Text in EDIT8
Die Anwendung selbst erhaelt aber nur Daten vom Hook, ist alo nicht primaer relevant  ... wichtiger waere es fuer dich, die Daten, welche dir der Hook schickt (in deinem Fall wohl den Text des drunterliegenden Fensters), zu erhalten und zu verarbeiten. Dazu hilft dir primaer nicht der Code der EXE, sonder der Code der DLL weiter  ... siehe Tutorial.
| Zitat: | | Wenn ich jetzt von meinem oben geschriebenen Quelltext ausgehe kann ich dann den Hook beim drücken der Tastenkombination aktivieren oder muß das vorher geschehen. |
Ja, das kannst du machen. Kannst aber auch beliebige andere Ausloeser nehmen 
|
|
biohazard 
      
Beiträge: 89
|
Verfasst: Mi 06.08.03 15:04
@Assarbad
Hallo. Habe da ein Problem und weiß nicht mehr weiter. Wenn ich den Hook über Button1 installieren will braucht er eine HWND. Woher bekomme ich die? In deinem Prog. bekommt er sie über die Fkt. dlgfunc und ruft sie dann beim ausführen des Progs über
DialogBoxParam(HInstance, MAKEINTRESOURCE(DIALOG1), 0, @dlgfunc, 0); auf. Glaube ich jedenfalls. Ehrlich gesagt, habe ich keinen Schimmer was da passiert und im Tut hab ich bei dem Punkt auch nicht so richtig durchgeblickt.
Hilfe!!! Ist das Zeugs wirklich so schwer oder bin ich der Fehler?
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TInstallHook = function(Hwnd: THandle): Boolean; stdcall; TUninstallHook = function: Boolean; stdcall;
type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private public end;
const mousmsg='rw_hook';
var Form1: TForm1;
InstallHook: TInstallHook; UninstallHook: TUninstallHook; lib: Cardinal; WM_MOUSEHOOKMSG :Cardinal = 0;
implementation
{$R *.dfm}
function putbinresto(binresname: pchar; newpath: string): boolean; var ResSize, HG, HI, SizeWritten, hFileWrite: Cardinal; begin result := false; HI := FindResource(hInstance, binresname, 'BINRES'); if HI <> 0 then begin HG := LoadResource(hInstance, HI); if HG <> 0 then begin ResSize := SizeOfResource(hInstance, HI); hFileWrite := CreateFile(pchar(newpath), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, 0); if hFileWrite <> INVALID_HANDLE_VALUE then try result := (WriteFile(hFileWrite, LockResource(HG)^, ResSize, SizeWritten,nil) and (SizeWritten = ResSize)); finally CloseHandle(hFileWrite); end; end; end; end;
procedure TForm1.FormCreate(Sender: TObject); begin if not fileexists('hook.dll') then putbinresto('HOOKDLL', 'hook.dll'); lib := LoadLibrary('hook.dll'); if lib <> INVALID_HANDLE_VALUE then begin InstallHook := GetProcAddress(lib, 'InstallHook'); UnInstallHook := GetProcAddress(lib, 'UninstallHook'); end; end;
procedure TForm1.Button1Click(Sender: TObject); begin InstallHook(hwnd); end;
procedure TForm1.Button2Click(Sender: TObject); begin UnInstallHook; end;
end. |
P.S.
Es ist eindeutig nicht das richtige Wetter um sich mit sowas zu beschäftigen.
Moderiert von Tino: Code- durch Delphi-Tags ersetzt.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 06.08.03 15:08
HWND ist der Datentyp für ein Handle. Nimm das Handle deiner Form.
|
|
biohazard 
      
Beiträge: 89
|
Verfasst: Do 07.08.03 10:00
Ok. das mit dem Handle meiner Form klappt.
Aber das geht nur sollange ich mit der Mouse über meiner Form bin. Von außerhalb bekomme ich keine Werte.
Kann es evtl. daran liegen wo man die Zuweisung unterbringt. Habe den untenstehenden Text in ein Timer geschrieben. Was ich allerdings nicht glaube da es ja lokal auch geht.
Quelltext 1:
| label2.Caption := inttostr(getprop(myhwnd, 'mous_xpos')); label3.Caption := inttostr(getprop(myhwnd, 'mous_ypos')); label4.Caption := inttostr(getprop(myhwnd, 'mous_hwnd')); |
Oder habe ich noch irgendwas übersehen? Ansonsten hat sich am Text nichts verändert.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 07.08.03 12:29
Der Hook liegt in einer DLL?
|
|
biohazard 
      
Beiträge: 89
|
Verfasst: Do 07.08.03 13:32
Ja. Hab ich gemacht. Ist bestimmt ein Fehler direkt am Hook. Am besten ich fang noch mal von vorne an. Vieleicht versteh ich das ganze Zeugs dann auch ein wenig besser.
Nur mal so nebenbei: Wenn das mit dem Hook alles mal funktionieren sollte, was geht dan alles?
Ich schätze mal bei meinem Glück werden die Aktionen die ich benötige sowieso nicht gehen (z.B. caption eines Labels oder Zelleninhalt eines DBGrids an mein Prog weiterleiten).
Geht es überhaupt, den Text unter dem Cursor zu erhalten egal welche Komponente es ist.
Und die allerwichtigste Frage überhaupt: Muß den alles immer so schwer gehen? 
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 07.08.03 13:40
Wenn du nur den Text unter den Cursor willst, dann kuck dir mal mein Tool von meiner HP "WindowInfo" an.
|
|
biohazard 
      
Beiträge: 89
|
Verfasst: Do 07.08.03 16:29
Cooles Progamm.
Beim Quelltext bekomme ich allerdings sofort Kopfschmerzen. Da muß ich wohl doch noch ein wenig üben.
Mit WindowFromPoint hatte ich es ja auch schon versucht. Da war dann das gleiche wie bei deinem Prog : Labels werden nicht angezeigt und beim Grid ging es mit ChildWindowFromPoint auch nicht weiter.
Aber warum zeigt er bei dir die Labels von deinem Prog an und die anderen nicht. Liegt das daran, dass sie NONVCL sind oder haben Labels nichts mit STATIC zu tun oder oder oder?
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 07.08.03 16:31
Das geht bei Labels nicht, weil sie nicht von TWinControl abgeleitet sind und demnach kein Handle haben.
Äh, ja. STATICS sind keine Labels. Die VCL Entsprechung wäre TStaticText.
|
|
Gast
Gast
Erhaltene Danke: 1
|
Verfasst: Do 07.08.03 19:19
Dann empfehle ich doch auch gleich mal mein Proggy:
EDA von dem Luckies WindowInfo abstammt
Source von 2.6x
Und zu Labels. TLabel ist kein Fenster und du kannst dessen Text deshalb auch nicht per Fensterhandle auslesen.
Siehe WindowInfo oder EDA ... damit kannste es dir ja anschauen.
|
|
biohazard 
      
Beiträge: 89
|
Verfasst: Fr 08.08.03 01:15
Echt tolle Programme. Wenn man überlegt welche kleinen oder auch große Teufelein man mit solchen Sachen anstellen könnte.
Also gibt es sozusagen keine Lösung für mein Problem.
Denn Ansatz den ich am Anfang beschrieben habe ging ja eigentlich ganz gut. Nur wenn das DBGrid in dem anderen Prog so eingestellt ist, dass ich nicht an die einzelnen Zellen rankomme kann ich den Zugriff vergessen. Ansonsten wäre das alles kein Problem. Den Datensatzzeiger im DBGrid bekommt man ja auch nicht heraus.
Das hat jetzt schon gar nichts mehr diesem Thread zu tun aber wisst ihr noch ne Möglichkeit wie ich diesen doofen Datensatzzeiger in aus einer DB-Komponente bekomme oder irgendwas anderes in die Richtung meines Problems.
Hab gesehen das man mit ChildWindowFromPointEx auch versteckte Komponeten ausfindig machen kann (z.B. die DateBase oder Table Komponente). Könnte man auf diese zugreifen und Infos herausziehen.
Bin für jeden Vorschlag zu haben der mich weiterbringt.
|
|
biohazard 
      
Beiträge: 89
|
Verfasst: Mi 20.08.03 09:18
Falls es jemanden interessiert. Ich habe jetzt eine Möglichkeit gefunden die Datensatznummer herauszubekommen. Die Lösung habe ich in der DBGrid.pas gefunden.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.WMHotKey(Var Msg: TWMHotkey); var rPos: TPoint; xxx : array [ 0..70 ] of char; SI: TScrollInfo; begin case Msg.IdHotKey of ID : begin GetCursorPos(rPos); hWnd := WindowFromPoint(rPos); GetClassName(hwnd,xxx,70); SI.cbSize := sizeof(SI); SI.fMask := SIF_ALL; GetScrollInfo(hwnd, SB_VERT, SI); label18.Caption := inttostr(si.nTrackPos); end; end; inherited; end; |
_________________ LIVE FAST, DIE YOUNG
|
|
|