Autor Beitrag
Ja-Pa
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 458

Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
BeitragVerfasst: Fr 03.10.03 16:17 
Hallo,

ich möchte den Text der in einer beliebigen Windows-Anwendung markiert (aber nicht kopiert) wurde auslesen. Gibt es da irgendeine Möglichkeit?
Danke im Voraus,

Ja-Pa

P.S.: Weiter unten hat worm die Idee gehabt, Strg+C zu simulieren.
Aber wie simuliert man zwei Tastendrücke gleichzeitig?
In dem Forum findet man immer nur Lösungen für eine Taste.

_________________
Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.


Zuletzt bearbeitet von Ja-Pa am Di 21.10.03 10:57, insgesamt 4-mal bearbeitet
Tana´Ri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 230



BeitragVerfasst: Do 09.10.03 09:28 
vielleicht hilft das weiter:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
{ entweder
   H := GetActiveWindow; 
   oder
   H := WindowFromPoint(TPoint); [etCursorPos]
   oder / und
   H := ChildWindowFromPoint(WindowFromPoint(TPoint) , TPoint);
);}

Function GetSelText(H : THandle) : PCHAR; // API-Solution
 var P : array [0..1024of char;
      n : integer;
 begin
  n := SendMessage(H,WM_GETTEXTLENGTH,0,0) + 1// + 1 because #0
  if n > 1 then
   if SendMessage(H,WM_GETTEXT,n,Integer(@P)) > 0 then result := P else result := #0;
end;

_________________
mfg
Tana´Ri
Ja-Pa Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 458

Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
BeitragVerfasst: Sa 11.10.03 14:06 
Titel: Vielen Dank!
Vielen Dank! Ich hätte, ehrlich gesagt, es nicht für möglich gehalten!
Wie bekomme ich es hin, dass der Text erst dann ausgelesen wird, wenn man in meinem Form auf einen Button klickt? Dann ist das Fenster, in dem der Text markiert wurde nämlich nicht mehr aktiv...

_________________
Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.
Shark
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 87

98, XP
D3, D5, D7
BeitragVerfasst: Sa 11.10.03 21:29 
Lass einen Timer laufen, der sich das Handle des aktiven Fensters holt und speichert...
Ja-Pa Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 458

Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
BeitragVerfasst: So 12.10.03 10:52 
Shark hat folgendes geschrieben:
Lass einen Timer laufen, der sich das Handle des aktiven Fensters holt und speichert...

Das ist mir dann auch eingefallen :) Ich habe es jetzt so gemacht, dass wenn mein Form deaktiviert wird (Application.onDeactivate) der Timer auf enabled gesetzt wird und jede Sekunde das Handle des aktiven Fensters speichert (GetActiveWindow).
Wenn das Form wieder aktiviert wird, wird der Timer gestoppt und das gespeicherte Handle der function GetSelText überheben.
Thanks2all!!!
Ja-Pa

_________________
Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.
Ja-Pa Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 458

Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
BeitragVerfasst: Di 14.10.03 10:01 
Titel: Das geht nicht!
Ich habe jetzt den Tipp von Tana'Ri ausprobiert, aber es gibt immer nur zwei undefinierte Zeichen als Ergebnis! Manchmal bekomme ich auch den Namen meiner Anwendung, aber beides ist nicht unbedingt das, was ich haben möchte.

Gruß, Ja-Pa

_________________
Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.
Ja-Pa Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 458

Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
BeitragVerfasst: So 19.10.03 11:05 
Hallo?
Hat da niemand mehr eine Idee :bawling:

_________________
Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.
toms
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1099
Erhaltene Danke: 2



BeitragVerfasst: So 19.10.03 14:15 
Zitat:
SendMessage(H,WM_GETTEXT,n,Integer [...]


WM_GETTEXT ist nicht eine universal Lösung um Text von
einem Control auszulesen.
Den Text von Winword bekommst du - beispielweise - damit nicht.
Dort müsstest du den Text über OLE auslesen.
Ja-Pa Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 458

Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
BeitragVerfasst: So 19.10.03 16:48 
Muss ich dann für jedes Programm ein OLE einbinden?
Ich möchte nämlich, dass das mit dem markierten Text auslesen bei allen Programmen, bei denen man Text bearbeiten kann, funktioniert.
Gibt es da nicht noch eine universelle Möglichkeit?

Verzweifelt :cry:, Ja-Pa

_________________
Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.
worm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 135


D6 Prof
BeitragVerfasst: Mo 20.10.03 01:03 
Hmm... eine nicht so elegante Lösung wäre, ein STRG+C an die Anwendung zu schicken, so dass der markierte Text in der Zwischenablage landet (was man aber nicht immer garantieren kann, oder?). Falls der Inhalt der Zwischenablage erhalten bleiben soll, müsste dein Programm vorher den Inhalt der Zwischenablage sichern und nach dem Abholen des Textes den vorherigen Inhalt wieder in die Zwischenablage kopieren. Wirklich nicht elegant, aber sollte funktionieren. Würde zumindest den Umweg über OLE sparen.

_________________
In the beginning, the universe was created. This has made a lot of people very angry, and is generally considered to have been a bad move.
Ja-Pa Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 458

Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
BeitragVerfasst: Di 21.10.03 10:35 
Gute Idee! :D :D :D
Aber wie kann ich Strg+C simulieren? In diesem Forum gibt es zwar schon viele Möglichkeiten, den Druck auf EINE Taste zu simulieren, aber auch zwei gleichzeitig?

_________________
Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.


Zuletzt bearbeitet von Ja-Pa am Di 21.10.03 10:54, insgesamt 1-mal bearbeitet
Tana´Ri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 230



BeitragVerfasst: Di 21.10.03 10:43 
[API] SendInput

Hab das zwar noch nicht ausprobiert, aber selbst ist der Programmierer ;)

Zitat:

(PSDK)
The SendInput function synthesizes keystrokes, mouse motions, and button clicks.

Syntax

UINT SendInput( UINT nInputs,
LPINPUT pInputs,
int cbSize
);
Parameters

nInputs
[in] Specifies the number of structures in the pInputs array.
pInputs
[in] Pointer to an array of INPUT structures. Each structure represents an event to be inserted into the keyboard or mouse input stream.
cbSize
[in] Specifies the size, in bytes, of an INPUT structure. If cbSize is not the size of an INPUT structure, the function will fail.
Return Value

The function returns the number of events that it successfully inserted into the keyboard or mouse input stream. If the function returns zero, the input was already blocked by another thread.

To get extended error information, call GetLastError.


Remarks

The SendInput function inserts the events in the INPUT structures serially into the keyboard or mouse input stream. These events aren't interspersed with other keyboard or mouse input events inserted either by the user (with the keyboard or mouse) or by calls to keybd_event, mouse_event, or other calls to SendInput.

This function does not reset the keyboard's current state. Any keys that are already pressed when the function is called might interfere with the events that this function generates. To avoid this problem, check the keyboard's state with the GetAsyncKeyState function and correct as necessary.

Function Information

Header Declared in Winuser.h, include Windows.h
Import library User32.lib
Minimum operating systems Windows 98, Windows NT 4.0 Service Pack 3



_________________
mfg
Tana´Ri
Ja-Pa Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 458

Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
BeitragVerfasst: Di 21.10.03 10:53 
So ganz verstehe ich das aber nicht :oops:.
Wie erstellt man z.B. ein Array von "Input structures"?
Aber das hört sich nicht schlecht an.

_________________
Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.
Tana´Ri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 230



BeitragVerfasst: Di 21.10.03 12:08 
ganz einfach uses windows.pas
und dann

MyArray : array [0..n] of tagINPUT;

_________________
mfg
Tana´Ri
Ja-Pa Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 458

Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
BeitragVerfasst: Di 21.10.03 16:35 
Und wie speichere ich dann das Strg+C in dem tagInput?

_________________
Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.
Tana´Ri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 230



BeitragVerfasst: Di 21.10.03 17:22 
Nicht getestet (!)

ausblenden volle Höhe 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:
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:
 Type

     TCOPYSEL  = array [0..1of TINPUT;

 var
     KbInf_STRG, KbInf_C    : TKeybdInput;

     FirstInput,SecondInput : TInput;

     SizeofInputStruct       : cardinal;

     P                      : TCOPYSEL;

     PCOUNT                 : Integer;

begin


  with KbInf_STRG do
   begin
    wVk         := VK_SHIFT;
    wScan       := 0// not used
    dwFlags     := KEYEVENTF_KEYUP;
    time        := round(Now);
    dwExtraInfo := GetMessageExtraInfo;
  end;

  with KbInf_C do
   begin
    wVk         := 43// = C
    wScan       := 0// not used
    dwFlags     := KEYEVENTF_KEYUP;
    time        := round(Now);
    dwExtraInfo := GetMessageExtraInfo;
  end;

  with FirstInput do
   begin
    Itype := 1;
    ki    := KbInf_STRG;
  end;

  with SecondInput do
   begin
    Itype := 1;
    ki    := KbInf_C;
  end;

  SizeofInputStruct := SizeOf(TInput);

  P[0]:=FirstInput;
  P[1]:=SecondInput;

  PCOUNT := High(P) + 1// nicht bei Null beginned -> +1

  SendInput(PCOUNT,P[0],SizeofInputStruct);
  // nur P (= Referenz) funktioniert nicht, es muss expliziet die Addresse
  // des ersten Elementest übergeben werdern
  // PCount = Elementanzahl + SizeOfInputStruct 
  // -> intern wohl sowas inc(P[0],SizeOfInputStruct) so würde P[0]
  // eigentlich auf P[1] zeigen (Pointer um den Speicherbedarf erhöht)


so ungefähr ;)

ps: bei den dwFlags musst du noch nachsehn hab einfach mal default besetzt.
GetMessageExtraInfo hab ich mal dazu gesetzt ist aber glaub ich net so wichtig (?)

_________________
mfg
Tana´Ri
Ja-Pa Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 458

Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
BeitragVerfasst: Di 21.10.03 18:01 
Oh! :shock: Ein ganzer Quellcode, bei dem ich über die Hälfte so nicht gewusst habe :wink:, vielen Dank! Du scheinst dich mit solchen Sachen echt gut auszukennen. Weißt du das alles auswendig (die ganzen Eigenschaften)?
Ich werd´s gleich mal ausprobieren! *sagwieeinkinddassgeradeeinencomputergeschenktgekriegthatundnichtweißwiemanihnbenutzt* :D

_________________
Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.
Ja-Pa Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 458

Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
BeitragVerfasst: Mi 22.10.03 10:49 
Es funktioniert nicht! :bawling: :bawling: :bawling:
Es gibt keine Compilerfehler und auch keine Exceptions, aber das Simulieren des Tastendrucks funktioniert nicht.
Ich habe auch schon versucht, D und C zu simulieren (falls die Sonderfunktion von Strg+C nicht erkannt wird), aber es geht auch nicht. Das aktive Fenster scheint diese Eingaben einfach nicht zu erhalten :?

mfg, Ja-Pa

_________________
Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.
Ja-Pa Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 458

Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
BeitragVerfasst: Mi 22.10.03 10:59 
Titel: Zwischenablage
Wie wird eigentlich die Zwischanablage von Windows verwaltet?
Wenn man ein Programm programmiert, kann man ja mit Memo1.Lines (oder Strings?).CopyToClipboard (oder so ähnlich, weiß nicht mehr genau) den markierten Text in die Zwischenablage kopieren.
Das heißt also, dass Memo entweder intern den markierten Text ausliest und ihn an eine DLL oder so übergibt oder dass eine DLL oder so :wink: aufgerufen wird, die dann den markierten Text ermittelt und kopiert.
Wenn das so wäre könnte doch eigentlich jede Anwendung auslösen, dass der markierte Text in die Zwischschenablage kopiert wird :?:
Kennt sich da jemand näher mit aus???

Gruß, Ja-Pa

_________________
Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.
Ja-Pa Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 458

Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
BeitragVerfasst: Mi 22.10.03 11:53 
Ich habe hier eine Komponente gefunden, die folgendes kann:
Zitat:

SendKeys is a Delphi Component which provides similar functionality to that of the Visual Basic SendKeys function. However it is more advanced in that it includes a function to send key strokes to a specific window. This insures that the specified window has keyboard focus and also makes moving from one application/window to another very easy.

The SendKeys package includes components for Delphi 2.0, 3.0, 4.0 and 5.0.

Hört sich doch eigentlich nicht schlecht an, oder?
Ich werde es gleich mal ausprobieren, hoffentlich kann es auch mehrere Tasten gleichzeitig senden :wink:

Editiert: Es kann mehrere Tasten senden, aber es ist Shareware.
Hier gibt es auch noch kostenlose Komponenten, die mehrere Tasten gleichzeitig senden können. Ich werde mal alle ausprobieren und dann hier posten, was die beste Lösung war.

_________________
Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.