AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mausrad simulieren

Ein Thema von markbolten · begonnen am 7. Apr 2016 · letzter Beitrag vom 11. Apr 2016
Antwort Antwort
markbolten

Registriert seit: 5. Jun 2005
25 Beiträge
 
#1

Mausrad simulieren

  Alt 7. Apr 2016, 15:32
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]
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Mausrad simulieren

  Alt 7. Apr 2016, 16:26
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
markbolten

Registriert seit: 5. Jun 2005
25 Beiträge
 
#3

AW: Mausrad simulieren

  Alt 8. Apr 2016, 08:02
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.
  Mit Zitat antworten Zitat
markbolten

Registriert seit: 5. Jun 2005
25 Beiträge
 
#4

AW: Mausrad simulieren

  Alt 8. Apr 2016, 14:59
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#5

AW: Mausrad simulieren

  Alt 8. Apr 2016, 15:15
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
markbolten

Registriert seit: 5. Jun 2005
25 Beiträge
 
#6

AW: Mausrad simulieren

  Alt 9. Apr 2016, 08:27
Danke
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#7

AW: Mausrad simulieren

  Alt 11. Apr 2016, 10:26
Und, hat der Rückgabewert etwas gesagt?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:30 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