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 Mausrad simulieren (https://www.delphipraxis.net/188791-mausrad-simulieren.html)

markbolten 7. Apr 2016 15:32

Mausrad simulieren
 
Hallo,
ich will aus meinem Programm heraus in einer anderen Anwendung die Anzeige vergrößern/verkleinern (= Zoomen). Um dies zu erreichen nutze ich die sendinput Funktion.
der nachfolgende Code zeigt meine Programm.

Es funktioniert aber nicht :(
kann mir einer sagen was falsch ist?

Vielen Dank im vorraus

Beispiel
[DELPHI
]unit MausradMain;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
TForm1 = class(TForm)
ButtonPlus: TButton;
ButtonMinus: TButton;
procedure ButtonPlusClick(Sender: TObject);
procedure ButtonMinusClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ButtonMinusClick(Sender: TObject);
var
Inp: TInput;
begin
Inp.Itype := INPUT_MOUSE;
Inp.mi.dwFlags :=MOUSEEVENTF_WHEEL;
Inp.mi.dx := 0;
Inp.mi.dy := 0;
Inp.mi.time := cardinal(-120);
Inp.mi.dwExtraInfo := 0;
SendInput(1, Inp, SizeOf(Inp));
end;

procedure TForm1.ButtonPlusClick(Sender: TObject);
var
Inp: TInput;
begin
Inp.Itype := INPUT_MOUSE;
Inp.mi.dwFlags :=MOUSEEVENTF_WHEEL;
Inp.mi.dx := 0;
Inp.mi.dy := 0;
Inp.mi.time := 600;
Inp.mi.dwExtraInfo := 0;
SendInput(1, Inp, SizeOf(Inp));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(handle, GWL_EXSTYLE, GetWindowLong(handle, GWL_EXSTYLE) or WS_EX_NOACTIVATE);

end;

end.
[/DELPHI]

Zacherl 7. Apr 2016 16:26

AW: Mausrad simulieren
 
So wie ich die MSDN-Library durchsuchenSendInput Funktion verstanden habe, schickt Diese nur Eingaben an das Control, das momentan den Fokus hat. Besser wäre es das WindowHandle deiner Zielkomponente zu ermitteln (MSDN-Library durchsuchenFindWindow, MSDN-Library durchsuchenFindWindowEx) und die Messages dann direkt per MSDN-Library durchsuchenPostMessage oder MSDN-Library durchsuchenSendMessage gezielt zu schicken.

Zum Ermitteln des WindowHandles gab es hier in der DP mal ein Programm namens Hier im Forum suchenWinSpy.

markbolten 8. Apr 2016 08:02

AW: Mausrad simulieren
 
Die externe Anweisung hat den Eingabefokus, durch die Zeile in Formvcreate behält die externe Anweisung den Eingabefokus auch dann noch wenn ich einen Button in meinem Program drücke.

Werde den Vorschlag mal in die Tat umsetzen.

markbolten 8. Apr 2016 14:59

AW: Mausrad simulieren
 
Findwindow und Sendmessage funktionieren ebenfalls nicht.
Liegt der Fehler an Windows 10 64Bit?

Habe versucht eine Seite in Firefox zu sctllen

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var fenster : hwnd;
begin
  fenster:=FindWindow('MozillaWindowClass',nil);

  if fenster<>0 then begin
    sendmessage(fenster,wm_mousewheel,120,0);
  end;
end;

himitsu 8. Apr 2016 15:15

AW: Mausrad simulieren
 
Zitat:

Zitat von markbolten (Beitrag 1335072)
Findwindow und Sendmessage funktionieren ebenfalls nicht.

Ganz Sicher?
Wenn FindWindow nicht geht, dann hast du wohl einen Fehler gemacht.

Es wurde dir doch aber schon ein Grund genannt?

Und das nächste mal bitte selber in der Hilfe nachsehen und prüfen, ob es z.B. Probleme mit der UIPI gibt.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  fenster: HWND;
begin
  fenster := FindWindow('MozillaWindowClass', nil);
  if fenster <> 0 then begin
    SetLastError(ERROR_SUCCESS);
    SendMessage(fenster, WM_MOUSEWHEEL, 120, 0);
    if GetLastError <> ERROR_SUCCESS then
      RaiseLastOSError; // ERROR_ACCESS_DENIED
  end else
    ShowMessage('Pech gehabt');
end;

markbolten 9. Apr 2016 08:27

AW: Mausrad simulieren
 
Danke

himitsu 11. Apr 2016 10:26

AW: Mausrad simulieren
 
Und, hat der Rückgabewert etwas gesagt?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:00 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