Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 332
  • Last Modified:

Simulate a keyPressed to other window

Well,
i wanna send a #13 = Return to a foreign program window
i do have the window's handle with a EnumWindowsetc.
the window is just an information, but you have to click an OK-button
i'd like to simulate the pressing or clicking of the return-key.

but  i think I have to get the Buttons Handle for this ??

This wouldn't help
g:=findwindow('TheWindow',nil);
d:=Childwindowfrompoint(g,point(50,50));
sendmessage(d,wm_char,#13,0);

so, please, help
Indi
0
Indefrei
Asked:
Indefrei
1 Solution
 
alexstewart@betaCommented:
Try the SendKeys code on the delphi cd. Also Al Williams had a Dr Dobbs article on this in delphi. The basic call is
....
Keybd_event
....
You need to activate the target window first so the keys go to it...

Alex

0
 
IndefreiAuthor Commented:
Don't agree with
>>You need to activate the target window first so the keys go to it...
cause

g:=findwindow('Notepad',nil);
d:=Childwindowfrompoint(g,point(50,50));
sendmessage(d,wm_char,ord('A'),0);

works well, without activating (whatever you mean with that)
perhaps it's the wrong way, but
i'm just looking for the child's handle
Indi
0
 
ahalyaCommented:
if you just want to click a button, then they easiest way is to send a "Button Clicked" command to its parent window.

assume "h_Parent" is the handle of your parent window (that you got using enumwindows or findWindow);

You'll need to know the DialogItemID of the button you want to click. (can be found using WinSight32). If you want to find the DlgID using code, then you can use enumchildwindows (or FindWindowEx).
Say "DlgID" is the ItemID of the button, then you can "Click" the button by using:

h_Btn := GetDlgItem(h_parent, DlgID);
PostMessage( h_Parent, wm_Command,  DlgID, MakeLong(h_Btn, BN_Clicked));
0
Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

 
intheCommented:
indi ,
if the button has a caption of 'Yes' with the Y has a underline for instance
it is '&Yes' (maybe you know ..
anyway you can do this:

var WName : Array[0..99] of Char;
    HH : THandle;

//Search Childs
Function TWCallBackChild(H : THandle; V : Longint) : Bool; stdcall;
begin
  GetwindowText(H,@WName[0],100);
  if StrPas(@WName[0]) = '&Yes' then
    HH := H;
  Result := True;
end;

//search Parents
Function TWCallBack(H : THandle; V : Longint) : Bool; stdcall;
begin
  GetwindowText(H,@WName[0],100);
  if StrPas(@WName[0]) = '&Yes' then
  begin
    HH := H;
  end
  else
    EnumChildWindows(H,@TWCallBackChild,V);
  Result := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Dummy : Longint;
begin
  HH := 0;
  EnumWindows(@TWCallBack,Dummy);  //Search through the windows
  if HH <> 0 then  //if found then press
  begin
    setforegroundwindow(hh);
sendmessage(HH,bm_click,0,0);//x_calibar
  end;
end;

end.

an example is open notepad and type something thenpress the x in corner to close notepad it asks to save "yes" "no" "cancel" buttons..
run the code above and it will press the '&Yes' button
0
 
IndefreiAuthor Commented:
Sounds good
with enumchildwindows etc.
try to give a code example, please
I'm back tomorrow
hope to cu
Indi
0
 
IndefreiAuthor Commented:
Ooops
too slow
didn't expect your presence so late, Barry
thought you are still searching for HIM, he,he
thanks everybody for the comments
check it tomorrow
Indi
0
 
IndefreiAuthor Commented:
ps
>> &Yes
As you can read above
it is a foreign program, means, i even don't know in which language it is written
and it is just an OK button
0
 
IndefreiAuthor Commented:
I see
The O is Underlined
try that
good night everybody
Indi
0
 
ahalyaCommented:
The following procedure will click the "OK" button. The handle of the window is the input. (the one you got in your enumwindows).
[You could use enumchildwindows as I have suggested earlier and given in the sample code of inthe.  This is an alternative way of doing it]

procedure ClickOkButton(h:HWND);

var c : HWND;
     s : string;
     b : array[0..100] of char;
     DlgID : Word;

begin;
c := GetWindow(h, GW_CHILD); //get first child window
repeat
  GetWindowText(c, @b, 100);
  s := string(b);
  DlgID  := GetDlgCtrlID(c);
  c := GetWindow(c, GW_HWNDNEXT); //get first child window
until (c = 0) or (lowercase(s) = '&ok');
PostMessage(h, wm_Command, DlgID, MakeLong(h, BN_Clicked));
end;

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now