RalphSCoffin
asked on
Use a Background Application to Perform Mouse Operations in a Foreground Application
I have a vendor supplied program which allows me to export data to a file by doing
a series of mouse operations. I'd like to have a background program which would
perform the export mouse operations periodically without my intervention. The
mouse targets are in predictable positions.
I've researched many documents on writing code to perform various mouse operations
and they seem relatively straightforward. However, I'm not sure about how to structure
the background program so that it does what I want without interfering with the
foreground application. Also, I have a feeling that such a program may have been written before, maybe many times.
Do you know of any source code that would do what I want? And if not, can you give me some guidance on how to structure my background program?
a series of mouse operations. I'd like to have a background program which would
perform the export mouse operations periodically without my intervention. The
mouse targets are in predictable positions.
I've researched many documents on writing code to perform various mouse operations
and they seem relatively straightforward. However, I'm not sure about how to structure
the background program so that it does what I want without interfering with the
foreground application. Also, I have a feeling that such a program may have been written before, maybe many times.
Do you know of any source code that would do what I want? And if not, can you give me some guidance on how to structure my background program?
ASKER
I want my background program to position the mouse over specific targets
on the screen and click or double click to cause the foreground program
(on the screen) to react just as though I had manually positioned the mouse
and clicked it myself. Collecting data on mouse activity from the journal
is not of use to me in what I'm trying to do.
on the screen and click or double click to cause the foreground program
(on the screen) to react just as though I had manually positioned the mouse
and clicked it myself. Collecting data on mouse activity from the journal
is not of use to me in what I'm trying to do.
hello RalphSCoffin, , what would be of use to you? ? ? I am not sure what to do to help you? If you already know the positions of the controls you need to click , then just use the mouse_event( ) function to "CLICK" that control, the mouse_event( ) function can do a "CLICK" (mouse down ans mouse Up) at any position , so you will need to know the postion of the control. I can not see any reason to position the cursor over the control, the postion of the cursor has nothing, that I know of, , to do with the programatic mouse down and mouse up mouse_event( ) funtion. . . . if you know the window's system handle for the controls, then you can also send them system messageses for the "CLICK" events. . . so you might say what you can do or have knowledge about the "Foreground" app.
the jounaling hook is an excelent way to record and then PLAYBACK a series of mouse or keyboard events, although AmirAzhdari did not show how to store and PLAYBACK the recorded journaling. . .
the jounaling hook is an excelent way to record and then PLAYBACK a series of mouse or keyboard events, although AmirAzhdari did not show how to store and PLAYBACK the recorded journaling. . .
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
There is also one TApplicationEvents to get the OnMessage event, so you can restart the hook if there's a WM_CANCELJOURNAL message.
unit MouseButton;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, AppEvnts;
type
TForm1 = class(TForm)
Button_StartJour: TButton;
Button_StopJour: TButton;
ListBox1: TListBox;
ApplicationEvents1: TApplicationEvents;
procedure Button_StartJourClick(Send
procedure Button_StopJourClick(Sende
procedure ApplicationEvents1Message(
var Handled: Boolean);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
JHook: THandle;
Track: Boolean;
implementation
{$R *.DFM}
function JournalProc(Code, wParam: Integer; var EventStrut: TEVENTMSG): Integer; stdcall;
var
Char1: PChar;
begin
{this is the JournalRecordProc}
Result := CallNextHookEx(JHook, Code, wParam, Longint(@EventStrut));
{the CallNextHookEX is not really needed for journal hook since it it not
really in a hook chain, but it's standard for a Hook}
if Code < 0 then Exit;
{you should cancel operation if you get HC_SYSMODALON}
if Code = HC_SYSMODALON then Exit;
if Code = HC_ACTION then
begin
{the EventStrut record has the Information about the mouse or keyboard
event. You said you just wanted the mouse button events so I get the
mouse down and mouse up event messages}
if EventStrut.message = WM_LBUTTONUP then
Form1.ListBox1.Items.Add('
+' and Y pos '+IntToStr(EventStrut.para
if EventStrut.message = WM_LBUTTONDOWN then
Form1.ListBox1.Items.Add('
+' and Y pos '+IntToStr(EventStrut.para
if EventStrut.message = WM_RBUTTONDOWN then
Form1.ListBox1.Items.Add('
+' and Y pos '+IntToStr(EventStrut.para
if (EventStrut.message = WM_RBUTTONUP) then
Form1.ListBox1.Items.Add('
+' and Y pos '+IntToStr(EventStrut.para
end;
end;
procedure TForm1.Button_StartJourCli
begin
if Track then
begin
ShowMessage('Mouse is already being Journaled, can not restart');
Exit;
end;
JHook := SetWindowsHookEx(WH_JOURNA
{SetWindowsHookEx starts the Hook}
if JHook > 0 then
begin
Track := True;
end else
ShowMessage('No Journal Hook availible');
end;
procedure TForm1.Button_StopJourClic
begin
Track := False;
UnhookWindowsHookEx(JHook)
JHook := 0;
end;
procedure TForm1.ApplicationEvents1M
var Handled: Boolean);
begin
{the journal hook is automaticly camceled if the Task manager
(Ctrl-Alt-Del) or the Ctrl-Esc keys are pressed, you restart it
when the WM_CANCELJOURNAL is sent to the parent window, Application}
Handled := False;
if (Msg.message = WM_CANCELJOURNAL) and Track then
JHook := SetWindowsHookEx(WH_JOURNA
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
{make sure you UN hook it if the app closes}
UnhookWindowsHookEx(JHook)
end;
end.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Hope you can use it, ask questions if you need more.