Toon posts:

[Delphi] controle of programma actief is

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb op dit moment een programma dat sendkey gebruikt om een "key" naar een ander programma te sturen.
Wanneer ik een key naar een ander programma probeer te sturen zonder dat dit programma geladen is, wordt deze key uitgevoerd in mijn eigen programma.

Ik wil dus een functie om te controlleren of een programma actief is. Dit moet dan wel gebeuren met de "caption" van het programma. Ik kan namenlijk niet achterhalen wat de EXE-naam van dit programma is.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Sinds wanneer is SendKey een API-call in Windows? :?

En wat voor programma heb je zelf geschreven? Heeft die ook een window? Wanneer wil je die key sturen? Meer info dus! Code!!!! P&W FAQ - De "quickstart"!!!!

Professionele website nodig?


Verwijderd

Topicstarter
SendKey is geen standaard van Delphi, daar gebruik ik een unit voor.
Die key wil ik sturen zodra dat programma geladen is.
Hier heb ik dus geen form voor nodig, het moet gewoon gebeuren zonder dat de gebruiker ziet dat er wat gebeurd

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

En waar haal je die 'SendKey' functie vandaan want je bent iets ontiegelijk fout aan het doen? :) Post die code eens?

Professionele website nodig?


Verwijderd

Topicstarter
Ik dacht al dat je zoiets zou denken O-) , ik zal even uit leggen waarvoor ik dit gebruik.

Er word via het netwerk een verplicht programma gestart, daar moet je op een knop drukken om deze te sluiten (niets illegaals dus)

Hieronder staat de code (kan je ook op internet vinden, maar ik kon de locatie even niet vinden)
Delphi:
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
procedure TSendkeys.Delay(n: Integer);
var   start: LongInt;
beg
   start := GetTickCount;
repeat      Application.ProcessMessages;
until (GetTickCount - start) >= n;
end;

procedure TSendkeys.MakeWindowActive(whandle: hWnd);
begin
  if IsIconic(whandle) then
   ShowWindow(whandle,SW_RESTORE)
  else
    BringWindowToTop(whandle);
end;

function TSendkeys.GetHandleFromWindowTitle(const titletext: string): hWnd;
var
 strbuf: Array[0..255] of Char;
begin
   result := FindWindow(PChar(0),
              StrPCopy(strbuf,titletext));
end;

procedure TSendkeys.SendKeys(const text: String);
var
   i: Integer;
   shift: Boolean;
   vk,scancode: Word;
   ch: Char;
   c,s: Byte;
const
   vk_keys: Array[0..9] of Byte =
      (VK_HOME,VK_END,VK_UP,VK_DOWN,VK_LEFT,
        VK_RIGHT,VK_PRIOR,VK_NEXT,VK_INSERT,
        VK_DELETE);
   vk_shft: Array[0..2] of Byte =
     (VK_SHIFT,VK_CONTROL,VK_MENU);
   flags: Array[false..true] of Integer =
     (KEYEVENTF_KEYUP, 0);
begin
   shift := false;
   for i := 1 to Length(text) do
   begin
      ch := text[i];
      if ch >= #250 then
      begin
         s := Ord(ch) - 250;
         shift := not Odd(s);
         c := vk_shft[s shr 1];
         scancode := MapVirtualKey(c,0);
         Keybd_Event(c,scancode,flags[shift],0);
      end
      else
      begin
         vk := 0;
         if ch >= #240 then
            c := vk_keys[Ord(ch) - 240]
         else if ch >= #228 then
            {228 (F1) => $70 (vk_F1)}
            c := Ord(ch) - 116
         else if ch < #32 then
            c := Ord(ch)
         else
         begin
            vk :=VkKeyScan(ch);
            c :=LoByte(vk);
         end;
         scancode := MapVirtualKey(c,0);
         if not shift and (Hi(vk) > 0) then
            { $2A = scancode of VK_SHIFT }
            Keybd_Event(VK_SHIFT,$2A,0,0);
         Keybd_Event(c,scancode,0,0);
         Keybd_Event(c,scancode,
               KEYEVENTF_KEYUP,0);
         if not shift and (Hi(vk) > 0) then
            Keybd_Event(VK_SHIFT,
               $2A,KEYEVENTF_KEYUP,0);
      end;
      Application.ProcessMessages;
   end;
end;

procedure TSendkeys.SendKeysTo(WindowTitle : string; const text: String);
var   Window : hWnd;
begin
   Window := GetHandleFromWindowTitle(WindowTitle);
   MakeWindowActive(Window);
   Sendkeys(text);
end;

[ Voor 4% gewijzigd door Verwijderd op 18-09-2003 15:56 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Voor zover ik de code nu kan zien ziet het er allemaal goed uit trouwens... met keybd_event zou dat moeten werken als het window actief is.

Professionele website nodig?


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Verwijderd schreef op 18 September 2003 @ 12:18:
[..]
Ik wil dus een functie om te controlleren of een programma actief is. Dit moet dan wel gebeuren met de "caption" van het programma. Ik kan namenlijk niet achterhalen wat de EXE-naam van dit programma is.
WindowHandles.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Waar komt die GetHandleFromWindowTitle functie vandaan? Heb je al gedebugged of die wel een handle teruggeeft? Zelfde vraag voor MakeWindowActive, ik ken ze allebei niet.

Als je dit met Win32 functies FindWindow en SetForegroundWindow doet zou het echt moeten werken, probeer dat eens. En check die returnvalues!

Professionele website nodig?


Verwijderd

Topicstarter
GetHandleFromWindowTitle geeft inderdaad alleen maar 0 terug. Ik gebruik nu
Delphi:
1
2
3
4
5
6
7
function gethandle(const titletext: string): hWnd;
var
 strbuf: Array[0..255] of Char;
begin
   result := FindWindow(PChar(0),
              StrPCopy(strbuf,titletext));
end;


deze geeft wel een waarde terug (bv. 328454)

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Welkom bij basiscursus debuggen les 1: check je returnvalues :z

Werkt het nu helemaal? :P

Professionele website nodig?


Verwijderd

Topicstarter
het programma werkt :) , ik kan alleen niets meer doen op mijn formulier :'( .

Dat is niet heel erg, want dat is op dit moment ook niet nodig, maar voor volgende toepassingen zou het wel leuk zijn als dit gewoon zou werken.

Is het soms zo dat die functie gethandle je programma vast zet?
Ik laat deze functie namenlijk elke 100miliseconde

Verwijderd

Topicstarter
als ik nu op mijn formulier klik, gaat windhoos zeuren dat mijn programma niet te gebruiken is door een geluidje te laten horen

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

FindWindow is niet van de snelste maar 10 keer per seconde moet makkelijk kunnen.

Vergeet je niet toevallig nadat je de keys hebt verstuurd de focus terug te zetten op het vorige window? ;)

hint: GetForegroundWindow

Professionele website nodig?


Verwijderd

Topicstarter
GetForegroundWindow heb ik gebruikt, maar die word pas geladen wanneer het andere programma de knoppen heeft ontvangen.

Als ik dat andere programma nog niet laad, maar mijn delphi-project wel, kan ik nog steeds niet in mijn programma.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Laat nu eens de code zien wat je nu exact iedere 100ms doet.

Professionele website nodig?


Verwijderd

Topicstarter
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm1.Timer1Timer(Sender: TObject);
VAR
  APP : String;
  N : Byte;
begin
  APP := APP_Caption.Text;
  If APP_Loaded(APP) = true
       then
         BEGIN
           For N := 1 to N_TAB.Value do
             SendKeys1.SendKeysTo(APP,Chr(9));
           SendKeys1.SendKeysTo(APP,Chr(13));
           While APP_Loaded(APP) = true do
             Application.ProcessMessages;
           Application.Terminate;
         END;
end;


hierbij is APP_Caption een textbox,
sendkeys een object gemaakt aan de hand van de vorige code (die lange)

[ Voor 12% gewijzigd door Verwijderd op 18-09-2003 16:03 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Maar waar herstel je die focus nu nadat je klaar bent met zenden? :?

Professionele website nodig?


Verwijderd

Topicstarter
dat is toch niet nodig als je gelijk na het sturen van de knoppen je programma sluit?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Nu ben je me kwijt..... :?

Kun je [rml]timmie2 in "[ Delphi] controle of programma actief is"[/rml] dan nog een keer stap voor stap uitleggen? :/

Professionele website nodig?


Verwijderd

Topicstarter
Er word hier een programma over het netwerk geperst (verplicht).

Dit programma heeft 2 knoppen.
1. sluit programma af, ga verder in windows

2. sluit programma af, sluit windows ook af


Ik heb dus een programma'tje gemaakt met de ondertussen bekende code (ik druk 1 keer op tab, en 1 keer op enter; zodat ik op de eerste knop druk. >:)

Daarna is mijn programma niet meer van belang; dus kan deze gesloten worden.

Als jij er een ander idee over hebt, hoor ik het graag. :*)
Pagina: 1