Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Mausklick simulieren funktioniert nicht (https://www.delphipraxis.net/85264-mausklick-simulieren-funktioniert-nicht.html)

snapman 28. Jan 2007 11:22


Mausklick simulieren funktioniert nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich versuche, bei Zone Alarm die Sicherheitsabfrage per Fensterhandle automatisch zu beantworten. (ist für eine Demo wie unsicher Windows ist dank der FensterN)
Bei der Windows Firewall klappt dies auch ohne anstand, aber bei ZoneAlarm komme ich über SetFocus nicht hinaus,
d.h. der Button "Zulassen" wird zwar focussiert, aber er klickt sich nicht :-(

Hier der Code (vorwiegend WinSpy generiert):

Delphi-Quellcode:
function FindWindowEx2(hParent: HWND; ChildClassName: string; ChildNr: Word): HWND;
var
  i: Word;
  hChild: HWND;
begin
  hChild := 0;
  Result := 0;
  ChildNr := ChildNr - 1;
  for i := 0 to ChildNr do
  begin
    hChild := FindWindowEx(hParent, hChild, PChar(ChildClassName), nil);
    if hChild = 0 then
      Exit;
    Result := hChild;
  end;
end;
Delphi-Quellcode:
procedure TForm1.Button7Click(Sender: TObject);
var wnd: HWND;
begin

wnd := FindWindow('#32770','ZoneAlarm-Sicherheitswarnung');
wnd := FindWindowEx2(wnd,'ZaButton', 3);

if wnd <> 0 then
begin
//ShowMessage('Window found. Handle: ' + IntToStr(wnd));

SendMessage(wnd, WM_SETFOCUS, 0, 0);

PostMessage(wnd, WM_LButtonDown, MK_LBUTTON,0 );
PostMessage(wnd, WM_LButtonUp, 0, 0);  }
end;
Im Anhang ist noch ein Screenshot vom ZA-Fenster und von WinSpy.

jmd anders 28. Jan 2007 11:33

Re: Mausklick simulieren funktioniert nicht
 
fehlen da nicht die koordinaten für den klick?

//bei der windows firewall funktioniert der gleiche code(bis eben auf das andere handle)?

snapman 28. Jan 2007 11:39

Re: Mausklick simulieren funktioniert nicht
 
Zitat:

Zitat von jmd anders
fehlen da nicht die koordinaten für den klick?

//bei der windows firewall funktioniert der gleiche code(bis eben
auf das andere handle)?

ja da funktionierts (nur das handle ist getaucht)
ich könnts ja mal mit koordinaten probieren

wie kann ich die koordinaten für den button ermitteln mittels des handles?

sebjensen 28. Jan 2007 12:02

Re: Mausklick simulieren funktioniert nicht
 
Hallo.

Das ist ja interessant. Könntest du mal den Code posten, mit dem man quasi ein automatisches Klicken der WindowsFirewall erstellen kann hier posten.

Das finde ich nämlich total spannend und würde mich freuen, wenn du meinen Wunsch erfüllen würdest.

snapman 28. Jan 2007 17:09

Re: Mausklick simulieren funktioniert nicht
 
Zitat:

Zitat von jmd anders
fehlen da nicht die koordinaten für den klick?

Also Koordinaten werden auf keinen Fall gebraucht.
Folgendes geht z.b. für den Startbutton:

PostMessage(FindWindowEx(FindWindow('Shell_TrayWnd ', nil),0, 'Button', nil), WM_LBUTTONDOWN, MK_LBUTTON, 0);
PostMessage(FindWindowEx(FindWindow('Shell_TrayWnd ', nil),0, 'Button', nil), WM_LBUTTONUP, MK_LBUTTON, 0);

Fängt ZA die Windows Messages ab oder was kann das sein?
Welche Alternativen habe ich?

Mit
Delphi-Quellcode:
SetCursorPos(x, y);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
gehts nämlich auch nicht :-(

[edit=SirThornberry]Delphi-Tags gesetzt - Mfg, SirThornberry[/edit]

Sascha L 28. Jan 2007 17:54

Re: Mausklick simulieren funktioniert nicht
 
Du fragst, ob Zone-Alarm die Messages abfängt. Ich hoffe doch! Was wäre das für eine Firewall, wenn jedes bösartige Programm sich selbst so einfach Zugang zum Internet beschaffen könnte!

snapman 28. Jan 2007 18:20

Re: Mausklick simulieren funktioniert nicht
 
Zitat:

Zitat von Sascha L
Du fragst, ob Zone-Alarm die Messages abfängt. Ich hoffe doch! Was wäre das für eine Firewall, wenn jedes bösartige Programm sich selbst so einfach Zugang zum Internet beschaffen könnte!

Naja man kann auch versteckt den Internet Explorer starten, der hat eh "immer" Zugriff.
Aber ob das nun so ist mit abfangen oder nicht wissen wohl am besten die WindowsAPI experten ;)

Sunlight7 28. Jan 2007 21:57

Re: Mausklick simulieren funktioniert nicht
 
Abend!

Zitat:

Zitat von snapman
der Button "Zulassen" wird zwar focussiert, aber er klickt sich nicht :-(

Zwar keine Ahnung hab obs klapp und kein ZA hab, aber spontan auf die Idee komme, wenn der Button schon den Fokus hat, die Leertaste zu drücken:

Delphi-Quellcode:
keybd_event(VK_SPACE, 0, 0, 0);
keybd_event(VK_SPACE, 0, KEYEVENTF_KEYUP, 0);
Grüßle!

snapman 28. Jan 2007 22:01

Re: Mausklick simulieren funktioniert nicht
 
Zitat:

Zitat von Sunlight7
Abend!

Zitat:

Zitat von snapman
der Button "Zulassen" wird zwar focussiert, aber er klickt sich nicht :-(

Zwar keine Ahnung hab obs klapp und kein ZA hab, aber spontan auf die Idee komme, wenn der Button schon den Fokus hat, die Leertaste zu drücken:

Delphi-Quellcode:
keybd_event(VK_SPACE, 0, 0, 0);
keybd_event(VK_SPACE, 0, KEYEVENTF_KEYUP, 0);
Grüßle!

danke, aber auch das funktioniert leider nicht
das seltsame: das event wird zwar ausgeführt, aber wohl leider nur auf meinen eigenen button in der delphi app der dann flackert
wobei das in dem fall nichts mit ZA zu tun hat, bei anderen handles passiert das gleiche
irgendwas stimmt da an deinem code nicht - oder reicht mein setfocus nicht, um die Tastatur auf den jeweiligen Button umzulenken?

Sunlight7 28. Jan 2007 22:18

Re: Mausklick simulieren funktioniert nicht
 
Ähm, der Code tut das gleiche, als das Du die Leertaste drücken würdest.

Warum flackert Dein Button???
Hat der den Fokus, bzw. wie oft rufst Du den Code auf?

Mit diesen Makros steure ich immer andere Programme, normal klappt das.

snapman 28. Jan 2007 22:25

Re: Mausklick simulieren funktioniert nicht
 
Zitat:

Zitat von Sunlight7
Ähm, der Code tut das gleiche, als das Du die Leertaste drücken würdest.

Warum flackert Dein Button???
Hat der den Fokus, bzw. wie oft rufst Du den Code auf?

Mit diesen Makros steure ich immer andere Programme, normal klappt das.

Also dein Tastaturevent an sich geht, daran liegt es nicht, habs anderweitig getestet.
Irgendwas stimmt also mit meinem Code nicht, vielleicht kann mir jemand weiterhelfen.
Fakt ist: Der andere Button bekommt zwar den Focus (gestrichelte Umrandung), aber einzig der Ausgangsbutton
von dem die procedure ausgeht flackert (gedrückt, nicht gedrückt etc)


Delphi-Quellcode:
var wnd: HWND;
begin

wnd := FindWindow('TForm1','Form1');
wnd := FindWindowEx2(wnd,'TButton', 8);

// wnd := FindWindow('#32770','ZoneAlarm-Sicherheitswarnung');
// wnd := FindWindowEx2(wnd,'ZaButton', 3);


if wnd <> 0 then
begin
SendMessage(wnd, WM_SETFOCUS, 0, 0);
end;

keybd_event(VK_SPACE, 0, 0, 0);
keybd_event(VK_SPACE, 0, KEYEVENTF_KEYUP, 0);

Sunlight7 28. Jan 2007 22:40

Re: Mausklick simulieren funktioniert nicht
 
Versuchs mal mit MSDN-Library durchsuchenSetForegroundWindow oder MSDN-Library durchsuchenBringWindowToTop

snapman 28. Jan 2007 23:10

Re: Mausklick simulieren funktioniert nicht
 
Zitat:

Zitat von Sunlight7

Das bringt ja nichts, im Vordergrund ist das Fenster ja in jedem Fall.
Ich habs mal manuell getestet, also WM_SETFOCUS ist nicht das richtige, es setzt war einen Focus aufs neue Handle,
aber nimmt ihn vom alten nicht weg.

kennt jemand den korrekten WM befehl der wirklich auch die Tastatur aufs neue Handle setzt?

bitsetter 28. Jan 2007 23:33

Re: Mausklick simulieren funktioniert nicht
 
Wenn der Focus auf die Taste gesetzt ist, müsste doch mit der Taste ENTER also vk_Return diese ausgeführt werden. Hast du schon mal die Tastenkombination ALT + L versucht?

snapman 28. Jan 2007 23:35

Re: Mausklick simulieren funktioniert nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von bitsetter
Wenn der Focus auf die Taste gesetzt ist, müsste doch mit der Taste ENTER also vk_Return diese ausgeführt werden. Hast du schon mal die Tastenkombination ALT + L versucht?

Tja leider geht der Focus vom alten Button aber nicht weg!!
habe mal einen screenshot angehangen auf dem man das problem sieht, beide buttons haben focus

snapman 29. Jan 2007 00:10

Re: Mausklick simulieren funktioniert nicht
 
So Leute ich kann einen ersten Erfolg vermelden!

Aktueller Code:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var wnd,wnd1,: HWND;

begin

wnd := FindWindow('#32770','ZoneAlarm-Sicherheitswarnung');

if wnd <> 0 then
begin
form1.caption:='Window found. Handle: ' + IntToStr(wnd);

SetForegroundWindow(wnd);
SendMessage(wnd, WM_SETFOCUS, 0, 0);


keybd_event(VK_TAB, 0, 0, 0);
keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0);

keybd_event(VK_TAB, 0, 0, 0);
keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0);

keybd_event(VK_SPACE, 0, 0, 0);
keybd_event(VK_SPACE, 0, KEYEVENTF_KEYUP, 0);
end;
end;
Also wenn ich das Fenster fokussiere springt der Fokus zunächst auf einen Info Button, dann auf eine Checkbox
"Regel immer anwenden" und dann auf Zulassen.
Mit Space kann ich diese nun klicken und die Anwendung wird zugelassen.

Nun habe ich jedoch noch 2 Probleme:
1.) Ich kann die Checkbox "Regel immer anwenden" nicht aktivieren wenn ich nach dem ersten tab noch ein space einfüge, obwohl ich so zulassen "klicken" kann.
Manuell per Tastatur geht es jedoch!

2.) Wenn ich das ganze in einen Timer tue wird zwar bei jeder ZA Sicherheitsanfrage automatisch "Zulassen" angeklickt,
jedoch hängt das komplette System danach weil er das Fenster irgendwie nichtmehr loslassen will.
Ich muss dann im passenden Moment auf Alt+F4 drücken, weil irgendwie dauernd weiter geklickt wird, was ja eigentlich nichtmehr sein sollte,
wenn das ZA Fenster weg ist.

Sunlight7 29. Jan 2007 00:14

Re: Mausklick simulieren funktioniert nicht
 
Also in Deinem Bild hat der IE Button den Focus

Edit: Nicht vorhandener Roter Kasten :?

bitsetter 29. Jan 2007 00:15

Re: Mausklick simulieren funktioniert nicht
 
Geht es hiermit?
Delphi-Quellcode:
SendMessage(wnd, messages.BM_CLICK, 0, 0);

Sunlight7 29. Jan 2007 00:19

Re: Mausklick simulieren funktioniert nicht
 
1. Wenn Du mit den Tabs auf die CheckBox stellst müßte es mit nem Space gehen
2. Timer abgestellt?

IMHO Unnötig.
Delphi-Quellcode:
SendMessage(wnd, WM_SETFOCUS, 0, 0);

snapman 29. Jan 2007 00:29

Re: Mausklick simulieren funktioniert nicht
 
Zitat:

Zitat von Sunlight7
1. Wenn Du mit den Tabs auf die CheckBox stellst müßte es mit nem Space gehen
2. Timer abgestellt?

IMHO Unnötig.
Delphi-Quellcode:
SendMessage(wnd, WM_SETFOCUS, 0, 0);

1. Also leider geht es seltsamer weise nicht. Warum weiss ich nicht :(

2. Also der grund warum das ganze system hängt:
das handle wird ständig gefunden, auch wenn zonealarm grad garkeine warnung ausgibt
dies ist auch nach einem windows reboot so obwohl nie eine warnung ausgegeben wurde
wenn ich nach dem handle suche, ists da!
was kann man da tun?

PS: Das SETFOCUS ist nicht unnötig, ohne gehts nicht

Sunlight7 29. Jan 2007 00:32

Re: Mausklick simulieren funktioniert nicht
 
1. Steht der Fokus auf der CheckBox?
2. MSDN-Library durchsuchenIsWindowVisible, bzw. MSDN-Library durchsuchenIsIconic

PS: Wieder nicht vorhandener roter Kasten: :? :?
Seltsam, ich verwende nie die WM_SetFocus Nachrichten :gruebel:

snapman 29. Jan 2007 00:45

Re: Mausklick simulieren funktioniert nicht
 
Zitat:

Zitat von Sunlight7
1. Steht der Fokus auf der CheckBox?
2. MSDN-Library durchsuchenIsWindowVisible, bzw. MSDN-Library durchsuchenIsIconic

PS: Wieder nicht vorhandener roter Kasten: :? :?
Seltsam, ich verwende nie die WM_SetFocus Nachrichten :gruebel:

Also erstmal ein BigTHX!! Dank IsWindowVisible klickt er den ganzen Kram jetzt automatisch ohne Murren weg auch im Timer!
Aber die Checkbox kann ich seltsamerweise trotz Focus nicht anhaken :(

Hier mal der aktuelle Code:

Delphi-Quellcode:
var wnd,wnd1: HWND;
begin

wnd := FindWindow('#32770','ZoneAlarm-Sicherheitswarnung');
wnd1 := FindWindowEx2(wnd,'ZaButton', 2); //Checkbox


if (wnd <> 0) and (iswindowvisible(wnd)) then
begin

SetForegroundWindow(wnd);
SendMessage(wnd, WM_SETFOCUS, 0, 0);


keybd_event(VK_TAB, 0, 0, 0);
keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0);

SendMessage(wnd1, WM_SETFOCUS, 0, 0); //FOcus auf checkbox

keybd_event(VK_SPACE, 0, 0, 0); //checkbox anhaken
keybd_event(VK_SPACE, 0, KEYEVENTF_KEYUP, 0);

  keybd_event(VK_TAB, 0, 0, 0);
 keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0);

keybd_event(VK_SPACE, 0, 0, 0); //Zulassen klicken
keybd_event(VK_SPACE, 0, KEYEVENTF_KEYUP, 0);
Also zulassen geht wunderbar mit dem Code, das mit der checkbox nicht, egal ob ich den focus auf die box reinnehme oder nicht

Sunlight7 29. Jan 2007 00:52

Re: Mausklick simulieren funktioniert nicht
 
Ähm, Du verwechselst da was:

WM_SETFOCUS wird an als Benachrichtigung an ein Fenster gesendet, das es den Fokus erhalten hat.
Was Du suchst ist: MSDN-Library durchsuchenSetFocus

Vorsicht: Windows.SetFocus schreiben :wink:

Edit: Deshalb auch die scheinbar 2 Fokusierten Buttons, bzw. hat die CheckBox nicht wirklich den Fokus, sie glaub es nur, weil Du ihr das vorgaukelst :mrgreen:

snapman 29. Jan 2007 00:57

Re: Mausklick simulieren funktioniert nicht
 
Zitat:

Zitat von Sunlight7
Ähm, Du verwechselst da was:

WM_SETFOCUS wird an als Benachrichtigung an ein Fenster gesendet, das es den Fokus erhalten hat.
Was Du suchst ist: MSDN-Library durchsuchenSetFocus

Vorsicht: Windows.SetFocus schreiben :wink:

Edit: Deshalb auch die scheinbar 2 Fokusierten Buttons, bzw. hat die CheckBox nicht wirklich den Fokus, sie glaub es nur, weil Du ihr das vorgaukelst :mrgreen:

hab es jetzt mit SetFocus probiert, nützt leuder auch nix
wnd1 ist die checkbox

Delphi-Quellcode:
......

keybd_event(VK_TAB, 0, 0, 0);
keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0);

Windows.SetFocus(wnd1);

keybd_event(VK_SPACE, 0, 0, 0);
keybd_event(VK_SPACE, 0, KEYEVENTF_KEYUP, 0);

Sunlight7 29. Jan 2007 01:04

Re: Mausklick simulieren funktioniert nicht
 
Wenn man das selber net Testen kann is etwas schwer :(

Aber Zeit für Plan B :mrgreen:

Hab mir das Bild nochmal angeguckt und gesehen, das die CheckBox nen AccelChar hat :stupid:

Versuchs mal damit:

Delphi-Quellcode:
// d drücken
keybd_event(68, 0, 0, 0);
keybd_event(68, 0, KEYEVENTF_KEYUP, 0);

Light 29. Jan 2007 01:16

Re: Mausklick simulieren funktioniert nicht
 
Eigentlich wäre es ja so viel zu einfach oder?

:-D

(kann es leider auch nicht testen...

Leuchtende Grüße

Stefan

Sunlight7 29. Jan 2007 01:26

Re: Mausklick simulieren funktioniert nicht
 
Nö warum,
eigentlich müßte das genügen:
Delphi-Quellcode:
...
begin
   SetForegroundWindow(wnd);
   
   keybd_event(68, 0, 0, 0); // d drücken
   keybd_event(68, 0, KEYEVENTF_KEYUP, 0);

   keybd_event(76, 0, 0, 0); // l drücken
   keybd_event(76, 0, KEYEVENTF_KEYUP, 0);
end;
Grüßle!

snapman 29. Jan 2007 02:18

Re: Mausklick simulieren funktioniert nicht
 
Zitat:

Zitat von Sunlight7
Wenn man das selber net Testen kann is etwas schwer :(

Aber Zeit für Plan B :mrgreen:

Hab mir das Bild nochmal angeguckt und gesehen, das die CheckBox nen AccelChar hat :stupid:

Versuchs mal damit:

Delphi-Quellcode:
// d drücken
keybd_event(68, 0, 0, 0);
keybd_event(68, 0, KEYEVENTF_KEYUP, 0);

Das mit dem d funktioniert nichtmal manuell.
Haben die Heinis zwar unterstrichen aber nicht implementiert

Light 29. Jan 2007 13:26

Re: Mausklick simulieren funktioniert nicht
 
Hi Ihr,

kann es sein das ihr grad nen Denkfehler eingebaut habt?

um den AccelChar anzusteuern benutzt man doch normalerweise auch die Alt taste oder??

das heißt erst alt taste Drücken dann D drücken dann D loslassen dann alt Loslassen ;-)

oder Irre ich mich jetzt?

Leuchtende Grüße

Stefan

snapman 29. Jan 2007 13:41

Re: Mausklick simulieren funktioniert nicht
 
Zitat:

Zitat von Light
Hi Ihr,

kann es sein das ihr grad nen Denkfehler eingebaut habt?

um den AccelChar anzusteuern benutzt man doch normalerweise auch die Alt taste oder??

das heißt erst alt taste Drücken dann D drücken dann D loslassen dann alt Loslassen ;-)

oder Irre ich mich jetzt?

Leuchtende Grüße

Stefan

also wie gesagt der AC für die checkbox funktioniert weder mit alt+d noch mit D
auch nicht wenn ich vor dem rechner selbst sitze und maus und tastatur benutze ;)

Sunlight7 29. Jan 2007 17:05

Re: Mausklick simulieren funktioniert nicht
 
Zitat:

Zitat von Light
kann es sein das ihr grad nen Denkfehler eingebaut habt?

um den AccelChar anzusteuern benutzt man doch normalerweise auch die Alt taste oder??

das heißt erst alt taste Drücken dann D drücken dann D loslassen dann alt Loslassen ;-)

oder Irre ich mich jetzt?

Jain, einen AccelChar kannst Du ohne Alt ansteuern, außer der Fokus ist ein einem Fenster, das Texteingabe kann, dann mußt Du Alt dazu drücken.

@snapman: Bist Du sicher, das das ZA-Fenster den Fokus hat?

snapman 29. Jan 2007 23:39

Re: Mausklick simulieren funktioniert nicht
 
Zitat:

Zitat von Sunlight7
Zitat:

Zitat von Light
kann es sein das ihr grad nen Denkfehler eingebaut habt?

um den AccelChar anzusteuern benutzt man doch normalerweise auch die Alt taste oder??

das heißt erst alt taste Drücken dann D drücken dann D loslassen dann alt Loslassen ;-)

oder Irre ich mich jetzt?

Jain, einen AccelChar kannst Du ohne Alt ansteuern, außer der Fokus ist ein einem Fenster, das Texteingabe kann, dann mußt Du Alt dazu drücken.

@snapman: Bist Du sicher, das das ZA-Fenster den Fokus hat?

ja ich hab ja selbst nochmal draufgeklickt und versucht d zu drücken
wie gesagt alles MANUELL ohne steuerung per software

Sunlight7 30. Jan 2007 00:04

Re: Mausklick simulieren funktioniert nicht
 
Seltsame Sache :gruebel:

Funktioniert eigentlich der "L" AccelChar?

snapman 30. Jan 2007 13:23

Re: Mausklick simulieren funktioniert nicht
 
Zitat:

Zitat von Sunlight7
Seltsame Sache :gruebel:

Funktioniert eigentlich der "L" AccelChar?

jo der L geht :freak:

algebra 26. Mär 2008 01:38

Re: Mausklick simulieren funktioniert nicht
 
vielen dank,,, wenn jemand nur wüsste, wie mann zonealarm über vnc bezw. teamviewer bezw. bei ähnlichen programmen steuern kann... Zulassen, verweigern bezw. beenden funktioniert nicht...

toms 26. Mär 2008 06:32

Re: Mausklick simulieren funktioniert nicht
 
Zitat:

Zitat von snapman
Hallo,

ich versuche, bei Zone Alarm die Sicherheitsabfrage per Fensterhandle automatisch zu beantworten. (ist für eine Demo wie unsicher Windows ist dank der FensterN)
Bei der Windows Firewall klappt dies auch ohne anstand, aber bei ZoneAlarm komme ich über

Das Problem hatte ich auch mit dem RemoteTool Logmein.

Lösung:

Zitat:

Why can't I click on ZoneAlarm notifications during remote control?

Due to a protection mechanism that can be configured via Zone Alarm, you can't click on ZoneAlarm notifications during remote control

For older versions of Zone Alarm (<6.5) go here:

http://www.computing.net/windows2000...rum/63977.html

For ZA version 6.5, please check under Program Options: "Allow Application Interaction" or "Protect ZoneAlarm Client".


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz