| Autor |
Beitrag |
Ivo@CoMRoK
      
Beiträge: 258
Win XP
D3 Prof., D7 Pe.
|
Verfasst: Di 20.01.09 17:07
Hi, Leute.
So ich hab mich seid Ewigkeiten hier nichmehr sehen lassen, hatte das Forum schon richtig vergessen, da ich auch länger nix mehr mit Delphi gemacht habe. Jetzt hab ich was angefangen soweit so gut. N paar Sachen wusst ich nich hab ich hier aber im Forum gefunden  Eins schaff ich aber doch nicht vll könnt ihr mir ja helfen? ^^
Also ich will mirn Programm schreiben mit dem ich den aktuellen Track aus Winamp im aktiven Fenster reinschreiben kann. Ich lese also den Titel aus (wies geht hab ich schon rausgefunden) speicher das als Text im Clipboard (is auch kein Problem ^^) jetzt hab ich allerdings das Problem mit dem Einfügen ich hab hier schonmal nen interessanten Thread gefunden, habe es auf "V" umgeschrieben und gehofft es würde dann also "Strg"+"V" senden, wenn ich es ausprobiere funktioniert es allerdings nicht. Der Einachheit halber habe ich das Programm mal nur als Konsolenanwendung laufen.
Hier mal der Code:
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:
| program Project3; {$APPTYPE CONSOLE}
uses Forms, Messages, Windows, StdCtrls, clipbrd;
{$R *.res}
procedure FindActiveControl; var hWindow: HWND; Pid1, Pid2: Cardinal; lParam: LongInt; ksNew, ksOld: TKeyboardState; begin Pid1 := GetWindowThreadProcessId(Application.Handle); Pid2 := GetWindowThreadProcessId(GetForeGroundWindow);
if AttachThreadInput(Pid1, Pid2, True) then begin hWindow := GetFocus; lParam := MakeLong(0, MapVirtualKey($43, 0)); ksNew[VK_CONTROL] := $80; GetKeyboardState(ksOld); SetKeyboardState(ksNew); PostMessage(hWindow, WM_KEYDOWN, $56, lParam); PostMessage(hWindow, WM_KEYUP, $56, lParam or $C0000000); Application.ProcessMessages; SetKeyboardState(ksOld); end; AttachThreadInput(Pid1, Pid2, False); end;
function GetWinampFilename(data:Integer): String; var Text: String; hwndWinamp, TempHandle : THandle; dat2: array[0..500] of Char; TrackPos: Integer; temp, MPointer: Cardinal; begin hwndWinamp:= FindWindow('Winamp v1.x',nil); if data<0 then TrackPos:= SendMessage(hwndWinamp,WM_USER,0 , 125) else TrackPos:=data; MPointer:= SendMessage(hwndWinamp,WM_USER,TrackPos , 212); GetWindowThreadProcessId(hwndWinamp,TempHandle); hwndWinamp:= OpenProcess(PROCESS_ALL_ACCESS,False,TempHandle); ReadProcessMemory(hwndWinamp, Pointer(MPointer), @dat2,500,temp); CloseHandle(hwndWinamp); Result:= dat2; end;
begin while (getasynckeystate(27) = 0) do begin if (getasynckeystate(13) <> 0) and (getasynckeystate(17) <> 0) and (getasynckeystate(18) <> 0) then begin writeln ( GetWinampFilename(-1) ); clipboard.astext := GetWinampFilename(-1); FindActiveControl; end; repeat until (getasynckeystate(13) = 0) or (getasynckeystate(17) = 0) or (getasynckeystate(18) = 0); end; end. |
Ich würd mich freuen wenn mir wer helfen kann, obwohl ich mich so lange hier nicht hab blicken lassen. Ich würd gern wieder mehr machen muss aber mindestens warten bis ich Abi rum hab, vll bin ich dann ja wieder mehr on.
mfg Ivo
edit: also ich hatte jetzt den Verdacht dasses daran liegt dass ich ne andere Kombination hab und nochma aufs wesentliche geändert:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| repeat until (getasynckeystate(18) <> 0); repeat until (getasynckeystate(18) = 0); sleep(1000); writeln ( GetWinampFilename(-1) ); clipboard.astext := GetWinampFilename(-1); FindActiveControl; sleep(1000); |
So. Ich hab noch das Sleep reingemacht dasses nich doch zuner Kombo kommt. Geht aber doch nicht  Ich hab jetzt echt keinen Plan mehr.
_________________ Fällt der Bauer tot vom Traktor, stand am Waldrand ein Reaktor.
Ein altes indianisches Sprichwort besagt:Es kann gefährlich sein gelben Schnee zu essen.
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Di 20.01.09 19:11
Nimm X-Spy um FindWindow-Code für das entsprechende Edit-Feld zu finden, dann nutze folgenden Code:
Delphi-Quelltext 1: 2: 3: 4: 5:
| P := PChar(song); SendMessage(wnd, WM_SETTEXT, 0, Cardinal(P)); |
Sollte funktionieren 
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Ivo@CoMRoK 
      
Beiträge: 258
Win XP
D3 Prof., D7 Pe.
|
Verfasst: Di 20.01.09 19:15
Danke für die Antwort, die auch gar nicht so lange gedauert hat, naja aber um ehrlich zu sein ^^:
Ich wollte das ganze für ICQ machen, da ich nicht MIranda und ähnliches draufmachen will xD
und die Einzelnen Fenster sind dann unterschiedlich bezeichnet, weshalbt ich wirklich das AKTIVE Element auswählen will. Trotzdem danke ^^
_________________ Fällt der Bauer tot vom Traktor, stand am Waldrand ein Reaktor.
Ein altes indianisches Sprichwort besagt:Es kann gefährlich sein gelben Schnee zu essen.
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Di 20.01.09 19:19
Ivo@CoMRoK hat folgendes geschrieben : | | das AKTIVE Element auswählen will. Trotzdem danke ^^ |
Schonmal mit der von dir genutzten Variable "hWindow" versucht?  Kann auch sein, dass du mit FindWindowEx noch das Eingabefeld von hWindow suchen musst.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Ivo@CoMRoK 
      
Beiträge: 258
Win XP
D3 Prof., D7 Pe.
|
Verfasst: Di 20.01.09 20:23
Hmmmm, eigentlich keine schlechte Idee. Puhhh ich hab lange nicht mehr mit HWNDs gearbeitet.
Es müsste doch eigentlich gehen, dass ich den Namen aus hWindow nehme und in Findwindow eintrage oder?
Beziehungsweise: Mache ich das überhaupt bis jetzt richtig, dass ich das aktive Fenster aktiviere?
_________________ Fällt der Bauer tot vom Traktor, stand am Waldrand ein Reaktor.
Ein altes indianisches Sprichwort besagt:Es kann gefährlich sein gelben Schnee zu essen.
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Di 20.01.09 22:00
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Ivo@CoMRoK 
      
Beiträge: 258
Win XP
D3 Prof., D7 Pe.
|
Verfasst: Mi 21.01.09 00:42
Okay. das mit dem findwondow ex hab ich hinbekommen, es funktioniert trotzdem nicht. Tut mir leid dass ich so nerve aber ich kriegs halt nicht hin.
Also mein Code sieht jetzt so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| . . . if AttachThreadInput(Pid1, Pid2, True) then begin hWindow := GetFocus; hWindow := FindWindowEx(hWindow, 0, '__oxFrame.class__', nil); hWindow := FindWindowEx(hWindow, 0, 'Internet Explorer_Server', nil); lParam := MakeLong(0, MapVirtualKey($56, 0)); PostMessage(hWindow, WM_KEYDOWN, $56, lParam); . . . |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| while (getasynckeystate(27) = 0) do begin if (getasynckeystate(17) <> 0) then begin writeln ( GetWinampFilename(-1) ); clipboard.astext := GetWinampFilename(-1); FindActiveControl; sleep(1000); end; repeat until (getasynckeystate(17) = 0) ; end; |
Tut mir echt leid ich hab überhaupt keinen plan mehr was jetzt noch fehlen könnte.
_________________ Fällt der Bauer tot vom Traktor, stand am Waldrand ein Reaktor.
Ein altes indianisches Sprichwort besagt:Es kann gefährlich sein gelben Schnee zu essen.
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mi 21.01.09 02:33
aber mit WM_SETTEXT hast du es auch schon versucht? Normalerweise nutzt man diese Methode um irgendwo Text einzufügen. Wer weiß ob der user grad was Wichtiges im Clipboard hat, das wär dann weg...
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Ivo@CoMRoK 
      
Beiträge: 258
Win XP
D3 Prof., D7 Pe.
|
Verfasst: Mi 21.01.09 13:22
Hmm hört sich interessant an. also ich hab mir gleich dazu n paar threads durchgelesen.
Ich habs jetzt so geändert:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure FindActiveControl(Text: String); var hWindow: HWND; Pid1, Pid2: Cardinal; lParam: LongInt; ksNew, ksOld: TKeyboardState; begin Pid1 := GetWindowThreadProcessId(Application.Handle); Pid2 := GetWindowThreadProcessId(GetForeGroundWindow);
if AttachThreadInput(Pid1, Pid2, True) then begin hWindow := GetFocus; SendMessage(hwindow, WM_SETTEXT, 0, Integer(PChar(text))); Application.ProcessMessages; sleep(100); end; AttachThreadInput(Pid1, Pid2, False); end; |
Es funktioniert trotzdem nicht auch wenn ich die // weglasse. Hab ich das jetzt richtig verwendet?
edit: ich habs auch hiermit probiert: www.swissdelphicente.../showcode.php?id=220
sieht jetzt so aus in der abfrage nach strg:
Delphi-Quelltext 1: 2: 3: 4:
| writeln ( GetWinampFilename(-1) ); clipboard.astext := GetWinampFilename(-1); PostKeyEx32(Ord('V'), [ssctrl, ssAlt], False); sleep(1000); |
_________________ Fällt der Bauer tot vom Traktor, stand am Waldrand ein Reaktor.
Ein altes indianisches Sprichwort besagt:Es kann gefährlich sein gelben Schnee zu essen.
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mi 21.01.09 17:44
Bist du sicher, dass du auch die richtigen Handles gefunden hast, denn was hat Internet Explorer_Server mit ICQ zu tun?
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
|