Startseite ¦  was ist neu ¦  programmier tips ¦  indy artikel ¦  intraweb artikel ¦  informationen ¦  links ¦  interviews ¦  sonstiges
kylix ¦  tutorials ¦  online shop ¦  fotos ¦  Add&Win Gewinnspiel


Willkommen Gast. Bitte einloggen oder registrieren.
22.05.2012, 14:42:48
Übersicht Hilfe Suche Einloggen Registrieren

+  SwissDelphiCenter Forum
|-+  German Forums
| |-+  Einsteiger Forum
| | |-+  Tastenkommando senden
« vorheriges nächstes »
Seiten: [1] Drucken
Autor Thema: Tastenkommando senden  (Gelesen 3577 mal)
Alfi
Gast
« am: 06.05.2002, 14:37:08 »

Hallo Leute,ich hab die Frage schonmal gestellt aber hab bis jetzt keine Antwort bekommen.Ich habe ein Spiel... und in diesem Fenster muss ich dauernd eine teste drücken,z.b. F2 ... Jetzt weiß ich aber nicht,wie ich das meinem Progrmm sagen soll.ich habe mal was von einem Fenster Handle gelesen,das man den dafür wissen muss... wie bekomme ich denn die handels aller Fenster,damit ich das Fenster meines Spiels auswählen knn um halt dieses Kommando zu senden ?

Vielen vielen vielen ... dank,für alle Antworten.

Alfi

Gespeichert
MR321
Sr. Member
****
Offline Offline

Beiträge: 363


« Antworten #1 am: 06.05.2002, 14:40:11 »

Was willst du mit den ganzen Handles?
Nimm doch einfach die OnKeyDown usw. des Forms!
Gespeichert

Computers are like air conditioners, they stop working immediately, if you open windows.
Alfi
Gast
« Antworten #2 am: 06.05.2002, 14:54:48 »

Ja,ich habs halt gelesen mit den handles,ich hab ja gesagt ich weiß nicht wies geht.Und wenns mit den handles der Fenster geht,dann muss ich alle haben,weil es ja nicht immer das gleiche Fenster ist.

Ich weiß auch nicht,wieso das als Einsteiger Frage eingestuft wird,ich hab die Frage schon zweimal gestellt und es konnte mir keiner eine konkrete Antwort geben.Ich glaube kaum,das Fragen die keiner direkt beantworten kann als Einsteigerfragen betrachtet werden,oder?

Naja.. ist ja auch egal,ist halt nur sehr wichtig :)

Alfi
Gespeichert
Thomas Stutz
Global Moderator
Hero Member
*****
Offline Offline

Beiträge: 1784



WWW
« Antworten #3 am: 06.05.2002, 15:05:04 »

Zitat
wie bekomme ich denn die handels aller Fenster,

Mit EnumWindows oder FindWindow.

[a href="http://www.swissdelphicenter.ch/de/showcode.php?id=327" target="_blank"]http://www.swissdelphicenter.ch/de/showcode.php?id=327[/a]

Tasten senden:

[a href="http://www.swissdelphicenter.ch/de/showcode.php?id=220" target="_blank"]http://www.swissdelphicenter.ch/de/showcode.php?id=220[/a]
Gespeichert

(¯`·._tom_.·´¯)

Tipp: Viele Antworten auf Fragen gibt's hier:
http://www.swissdelphicenter.ch/de/tipsuchen.php
Alfi
Gast
« Antworten #4 am: 06.05.2002, 15:37:29 »

Hallo Thomas, danke für deine Antwort,das war auch eigentlich genau was ich brauche,allerdings hab ich jetzt ein kleines problem.. ich verwende diese procedure

Code:
procedure PostKeyExHWND(hWindow: HWnd; key: Word; const shift: TShiftState;

  specialkey: Boolean);

type

  TBuffers = array [0..1] of TKeyboardState;

var

  pKeyBuffers: ^TBuffers;

  lParam: LongInt;

begin

  (* check if the target window exists *)

  if IsWindow(hWindow) then

  begin

    (* set local variables to default values *)

    pKeyBuffers := nil;

    lParam := MakeLong(0, MapVirtualKey(key, 0));



    (* modify lparam if special key requested *)

    if specialkey then

      lParam := lParam or $1000000;



    (* allocate space for the key state buffers *)

    New(pKeyBuffers);

    try

      (* Fill buffer 1 with current state so we can later restore it.

         Null out buffer 0 to get a "no key pressed" state. *)

      GetKeyboardState(pKeyBuffers^[1]);

      FillChar(pKeyBuffers^[0], SizeOf(TKeyboardState), 0);



      (* set the requested modifier keys to "down" state in the buffer*)

      if ssShift in shift then

        pKeyBuffers^[0][VK_SHIFT] := $80;

      if ssAlt in shift then

      begin

        (* Alt needs special treatment since a bit in lparam needs also be set *)

        pKeyBuffers^[0][VK_MENU] := $80;

        lParam := lParam or $20000000;

      end;

      if ssCtrl in shift then

        pKeyBuffers^[0][VK_CONTROL] := $80;

      if ssLeft in shift then

        pKeyBuffers^[0][VK_LBUTTON] := $80;

      if ssRight in shift then

        pKeyBuffers^[0][VK_RBUTTON] := $80;

      if ssMiddle in shift then

        pKeyBuffers^[0][VK_MBUTTON] := $80;



      (* make out new key state array the active key state map *)

      SetKeyboardState(pKeyBuffers^[0]);

      (* post the key messages *)

      if ssAlt in Shift then

      begin

        PostMessage(hWindow, WM_SYSKEYDOWN, key, lParam);

        PostMessage(hWindow, WM_SYSKEYUP, key, lParam or $C0000000);

      end

      else

      begin

        PostMessage(hWindow, WM_KEYDOWN, key, lParam);

        PostMessage(hWindow, WM_KEYUP, key, lParam or $C0000000);

      end;

      (* process the messages *)

      Application.ProcessMessages;



      (* restore the old key state map *)

      SetKeyboardState(pKeyBuffers^[1]);

    finally

      (* free the memory for the key state buffers *)

      if pKeyBuffers <> nil then

        Dispose(pKeyBuffers);

    end; { If }

  end;

end; { PostKeyEx }



procedure TForm1.Button1Click(Sender: TObject);

var

  targetWnd: HWND;

begin

  targetWnd := FindWindow('notepad',nil)

    if targetWnd <> 0 then

    begin

      PostKeyExHWND(targetWnd, Ord('I'), [ssAlt], False);

  end;

end;


Die Fensthandels hab ich jetzt in einer combobox stehen und die Taste(das kommando) was ich senden möchte steht ebenfalls in einer Combobox (F1..F12)

Siehst du eine Möglichkeit das man das in die Procedure einbauen kann?

Vielen Dank,Alfi
Gespeichert
MR321
Sr. Member
****
Offline Offline

Beiträge: 363


« Antworten #5 am: 06.05.2002, 15:41:49 »

Ach ich hab dich total falsch verstanden, ich dachte die ganze Zeit, dass du die Key-Ereignisse empfangen und nicht senden willst.
Gespeichert

Computers are like air conditioners, they stop working immediately, if you open windows.
Alfi
Gast
« Antworten #6 am: 06.05.2002, 15:46:14 »

Ist ja nicht schlimm,muss jetzt nur noch wissen wie ich die procedure umbaue.
Gespeichert
Thomas Stutz
Global Moderator
Hero Member
*****
Offline Offline

Beiträge: 1784



WWW
« Antworten #7 am: 06.05.2002, 15:55:20 »

Zitat
Die Fensthandels hab ich jetzt in einer combobox stehen

Sehe zwar nicht ganz ein, warum du das Handle in die Combobox schreibst, da ja beim Erzeugen eines Objekts immer ein anderes
Handle von Windows vergeben wird.

Aber wenn du es so möchtest, hier der Code.
(ungetestet)

[font size=2 face="Courier New"][font color="#000000"]procedure TForm1.Button1Click(Sender: TObject);
var
  
targetWnd: HWND;
begin
  
targetWnd := StrToInt(ComboBox1.Text);
  if targetWnd <> 0 then
  begin
    
PostKeyExHWND(targetWnd, ComBobox2.ItemIndex + VK_F1, [], False);
  end;
end;
[/font][/font]
Gespeichert

(¯`·._tom_.·´¯)

Tipp: Viele Antworten auf Fragen gibt's hier:
http://www.swissdelphicenter.ch/de/tipsuchen.php
Alfi
Gast
« Antworten #8 am: 06.05.2002, 16:02:53 »

Ich glaube ich hab mich irgendwie falsch ausgedrückt...sorry..also ich versuch es nochmal.

In der Combobox stehen die handels(ich denke mal das sie es sind) wie z.b.
SwissDelphiCenter.ch :: Antwort schreiben - Microsoft Internet Explorer

und in einer zweiten stehen die tastenkommandos,wie z.b. F5

wenn ich jetzt dieses handle auswähle

SwissDelphiCenter.ch :: Antwort schreiben - Microsoft Internet Explorer

un dazu das Kommando F5,dann müsste sich ja dann das Fenster aktualisieren.Aber ich glaube es sind gar keine window handles die ich da in der combobox hab,oder? weil irgendwas funktioniert nicht
Gespeichert
Thomas Stutz
Global Moderator
Hero Member
*****
Offline Offline

Beiträge: 1784



WWW
« Antworten #9 am: 06.05.2002, 16:16:37 »

Ich glaube du verstehst noch nicht ganz was Handles sind.
Hast du diesen Link angeschaut ?
[a href="http://www.swissdelphicenter.ch/de/showcode.php?id=327" target="_blank"]http://www.swissdelphicenter.ch/de/showcode.php?id=327[/a]

Zitat
SwissDelphiCenter.ch :: Antwort schreiben - Microsoft Internet Explorer

Das ist der Fenstertitel.
Wenn du nach einem Fenstertitel suchen möchtest, dann schreibe:

FindWindow(nil,FensterTitel)

FindWindow liefert dir dann das Handle (eine "Identifikations"-Zahl) auf das gefundene Fenster.
Dann kannst du das Handle der PostKeyExHWND übergeben.
Gespeichert

(¯`·._tom_.·´¯)

Tipp: Viele Antworten auf Fragen gibt's hier:
http://www.swissdelphicenter.ch/de/tipsuchen.php
Alfi
Gast
« Antworten #10 am: 06.05.2002, 17:16:42 »

Also,jetzt hab ich den Handle,bin mir sogar sicher *g* aber es stimmt wohl irgendwie immernoch etwas nicht.In Der Combobox1 steht F1 bis F12,die Kommandos die ich senden will.Ist da was in der procedure falsch ?

Code:

procedure TForm1.Button1Click(Sender: TObject);

var

  targetWnd: HWND;

begin

  targetWnd := FindWindow(nil,pchar(combobox3.text)); //Combobox3 = Fenstertitel

  if targetWnd <> 0 then

  begin

    PostKeyExHWND(targetWnd, ComBobox1.ItemIndex + VK_F1, [], False);

  end;

end;





Die letze zeile ist falsch,oder.. ?
Gespeichert
Slayer
Sr. Member
****
Offline Offline

Beiträge: 442



« Antworten #11 am: 06.05.2002, 17:40:43 »

procedure TForm1.Button1Click(Sender: TObject);
var
  targetWnd: HWND;
begin
  targetWnd := FindWindow(nil,pchar(combobox3.text)); //Combobox3 = Fenstertitel
  if targetWnd <> 0 then
  begin
  if ComBobox1.items.strings[combobox1.ItemIndex] = 'F1' then  
  PostKeyExHWND(targetWnd, VK_F1, [], False);

  if ComBobox1.items.strings[combobox1.ItemIndex] = 'F2' then  
  PostKeyExHWND(targetWnd, VK_F2, [], False);

und so weiter , aber das is n bisl umständlich , aber du verstehst was ich meine ? vielleicht gehts so besser ..
  end;
end;
Gespeichert
Thomas Stutz
Global Moderator
Hero Member
*****
Offline Offline

Beiträge: 1784



WWW
« Antworten #12 am: 06.05.2002, 17:53:58 »

@Slayer: Wenn eine Combobx mit F1 bis F12 aufgefüllt ist,
dann kann man es ohne weiteres so schreiben wie oben und
nicht mit 12 if-Abfragen.

PostKeyExHWND(targetWnd, ComBobox1.ItemIndex + VK_F1, [], False);
Gespeichert

(¯`·._tom_.·´¯)

Tipp: Viele Antworten auf Fragen gibt's hier:
http://www.swissdelphicenter.ch/de/tipsuchen.php
Alfi
Gast
« Antworten #13 am: 06.05.2002, 17:56:05 »

Hallo ihr zwei,

Ich versteh nicht so ganz,wo ist der unterschied ? wieso steht denn da Combobox1.text + VK_F1 ?
Gespeichert
Slayer
Sr. Member
****
Offline Offline

Beiträge: 442



« Antworten #14 am: 06.05.2002, 18:35:30 »

da is kein unterschied ich wurde lediglich berichtig hehe
was genau funktioniert denn nun eigentlich nich ? kommt ne fehlermeldung oder ??
Gespeichert
Alfi
Gast
« Antworten #15 am: 06.05.2002, 20:24:19 »

Ne es funktioniert ja jetzt war nur etwas verwirrt :)
Gespeichert
Seiten: [1] Drucken 
« vorheriges nächstes »
Gehe zu:  


Einloggen mit Benutzername, Passwort und Sitzungslänge

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006, Simple Machines LLC Prüfe XHTML 1.0 Prüfe CSS