MS SendInput

The open discussion of hosting, forum, web-sites, community organisation and open voting

Re: MS SendInput

Postby Josef Templ » Thu Jul 06, 2017 3:45 am

DGDanforth wrote:Some procedures do and others don't use [ccall]
-Doug


OK, there is one exception in WinApi, wsprintf.
It uses ccall because it is defined to use ccall in the corresponding C header file.
This is also documented in msdn.
This function is pretty useless, by the way, because it lacks the vararg parameter. A vararg
cannot be expressed in CP. In C a vararg is a variable number of arguments.
This function also has severe security issues.
It would be a candidate for removal, I think.

- Josef
Josef Templ
 
Posts: 222
Joined: Tue Sep 17, 2013 6:50 am

Re: MS SendInput

Postby DGDanforth » Sat Jul 08, 2017 4:37 am

The test program of SendInput works as advertized.
However, it does not work in the context I am using.
I am attempting to send keys to a different process.

I can do that easily using the deprecated function
WinApi.keybd_event
I attach to the process and set its focus.

So why do I need SendInput?
I was hoping it would resolve timing issues of keystroke handling.
Currently with WinApi.keybd_event I need to experimentally determine
the time between a keydown and a keyup (about 65ms). But that should
not be necessary (I believe). I would think that Microsoft and SendInput
would know whether an application is ready to receive input and wait
until it is then send a key. That doesn't seem to be the case. When I
use SendInput it does not fail and yet returns immediately even though
I have specified more than 500 keystrokes.

What must I do to get SendInput to work?
-Doug
User avatar
DGDanforth
 
Posts: 59
Joined: Tue Sep 17, 2013 1:16 am
Location: Palo Alto, CA, U.S.A.

Re: MS SendInput

Postby DGDanforth » Tue Jul 11, 2017 11:00 am

I discovered that SendInput sends all INPUT records simultaneously (it doesn't wait after sending one INPUT).
That is not what I want.
So, I have broken the array of inputs into individual INPUT and send them sequentially (with a delay).
That still doesn't work for sending to another process.

So I am back using the obsolete function and that works most of the time.
I have not yet found how to delay sending based on whether the process has eaten the previous characters I have sent.
PeekMessage always says there is nothing waiting.

-Doug
User avatar
DGDanforth
 
Posts: 59
Joined: Tue Sep 17, 2013 1:16 am
Location: Palo Alto, CA, U.S.A.

Re: MS SendInput

Postby Josef Templ » Tue Jul 11, 2017 12:15 pm

Maybe it is required to send both, key-down and key-up events.
Are you sending both?

- Josef
Josef Templ
 
Posts: 222
Joined: Tue Sep 17, 2013 6:50 am

Re: MS SendInput

Postby DGDanforth » Wed Jul 12, 2017 8:48 am

Josef Templ wrote:Maybe it is required to send both, key-down and key-up events.
Are you sending both?

- Josef

Yes, first down and then up.

I have also tried SendMessage since it claims to wait until the message is eaten.
Again, I use both down and up but that does not seem work.

Only
Code: Select all
   PROCEDURE KeyDown (key: Key);
   VAR
      bScan: SHORTCHAR;
      dwFlags: SET;
      dwExtraInfo: INTEGER;
      tkey:   Key;
   BEGIN
      tkey :=TranslateKey(key);
      bScan := 0X; (*SHORT(CHR(WinApi.MapVirtualKey(ORD(tkey), 0)));*)
      dwFlags := {};
      dwExtraInfo := 0;
      WinApi.keybd_event (tkey, bScan, dwFlags, dwExtraInfo)
   END KeyDown;
   
   PROCEDURE KeyUp (key: Key);
   VAR
      bScan: SHORTCHAR;
      dwFlags: SET;
      dwExtraInfo: INTEGER;
      tkey:   Key;
   BEGIN
      tkey :=TranslateKey(key);
      bScan := 0X; (*SHORT(CHR(WinApi.MapVirtualKey(ORD(tkey), 0)));*)
      dwFlags := WinApi.KEYEVENTF_KEYUP;
      dwExtraInfo := 0;
      WinApi.keybd_event (tkey, bScan, dwFlags, dwExtraInfo)
   END KeyUp;


works (most of the time). TranslateKey simply maps "R" to a right move key, etc.
User avatar
DGDanforth
 
Posts: 59
Joined: Tue Sep 17, 2013 1:16 am
Location: Palo Alto, CA, U.S.A.

Re: MS SendInput

Postby Josef Templ » Thu Jul 13, 2017 2:12 pm

with SendInput there is the requirement that the other process is at the same security level,
whatever that means in detail, but this is documented in msdn.
Maybe that is the problem why SendInput does not work.

- Josef
Josef Templ
 
Posts: 222
Joined: Tue Sep 17, 2013 6:50 am

Re: MS SendInput

Postby DGDanforth » Sat Jul 15, 2017 6:32 am

Josef Templ wrote:with SendInput there is the requirement that the other process is at the same security level,
whatever that means in detail, but this is documented in msdn.
Maybe that is the problem why SendInput does not work.

- Josef

Yes, I noticed that.
I am not sure how to determine the security level (have you yet looked into the issue)
- Doug
User avatar
DGDanforth
 
Posts: 59
Joined: Tue Sep 17, 2013 1:16 am
Location: Palo Alto, CA, U.S.A.

Re: MS SendInput

Postby Josef Templ » Sat Jul 15, 2017 11:30 am

I can use SendInput to send a keystroke to another BlackBox process.
At least in this case sending a key-down is sufficient.
Check if the receiving process has the focus.

- Josef
Josef Templ
 
Posts: 222
Joined: Tue Sep 17, 2013 6:50 am

Re: MS SendInput

Postby DGDanforth » Sun Jul 16, 2017 10:00 am

Josef Templ wrote:I can use SendInput to send a keystroke to another BlackBox process.
At least in this case sending a key-down is sufficient.
Check if the receiving process has the focus.

- Josef

to another BlackBox process

In my case the other process is a game.
Yes, it has the focus.
Let me try it again with SendInput.
- Doug
User avatar
DGDanforth
 
Posts: 59
Joined: Tue Sep 17, 2013 1:16 am
Location: Palo Alto, CA, U.S.A.

Re: MS SendInput

Postby DGDanforth » Sun Jul 16, 2017 10:39 am

Josef,
The game does not respond even when I put a 500ms delay between the down and the up.
The game has the focus when I am sending.
Code: Select all
WinApi.Sleep(sleepTime);

SendInput returns a non zero result indicating success.
-Doug
User avatar
DGDanforth
 
Posts: 59
Joined: Tue Sep 17, 2013 1:16 am
Location: Palo Alto, CA, U.S.A.

PreviousNext

Return to Brainstorming

Who is online

Users browsing this forum: No registered users and 0 guests