3 ways to use keyboard input in QuickTest Professional: Type, SendKeys and Device Replay

Automation Guild Online Conference Top ad

Three UFT/QTP Input Methods

There are three ways to use keyboard input in QuickTest Professional and Unified Functional Testing: Type, SendKeys and Device Replay. Why, you might ask, use the Type or Sendkeys method at all?  While you wouldn’t want to automate a whole script using SendKeys only, sometimes you may, on occasion, need to automate a section of an application where there is no object recognition.

For example, some unsupported grids or tree views in Quick Test Pro can be navigated using a combination of the HOME, END and arrow keys.  Also — I’ve seen applications where some fields need to have a keyboard event occur to trigger some other behavior (like tabbing of a field) using the objects standard Set method –- which would not work in this case.


Most objects support the TYPE method.  Type will enter the specified string into an object or perform a certain keyboard combination against an application.  For example:

To tab off an object you would use the following syntax:

SwfObject(“swfname:=Blank”).Type micTab

To enter text:

SwfObject(“swfname:=Blank”).Type “This is my string”

To send an enter keystroke:

SwfObject(“swfname:=Blank”).Type “ “

You can also send a combination of keystrokes at one time. The following holds down the CTRL and the Shift Keys, then presses the “L” key and releases the CTRL and Shift keys:

SwfObject("swfname:=Blank").Type micCtrlDwn + micShiftDwn + "L" + micShiftUp + micCtrlUp

*Important to remember: If you send a down keystroke, be sure to follow it with its corresponding up stroke, as seen in the above example.  Problems can arise by sending a micCtrlDwn and forgetting to release it using micCtrlUp. So, rule of thumb — if you are pressing a key, make sure to also release it.

Also Occasionally you may have issues with event not being  triggered when using one of these methods. In that case check out my post of how to use the FireEvent method.

2. VBScript SendKeys Method ( Also check out: QTP's VBscript SendKeys FAQ)

There are instances in which QTP’s Type method does not trigger certain events, or is unable to mimic certain keystrokes.  In these cases, VBScript SendKeys method can be used. To use the SendKeys you need to first set the WshShell object:

Dim mySendKeys
set mySendKeys = CreateObject("WScript.shell")

To send the text you would use:

mySendKeys.SendKeys(“This is my string”)

To send an enter keystroke:


*A few important tips: Unlike the QTP TYPE method, you will need to use curly braces for arguments like a TAB or Up arrow key strokes. Also — SendKeys has the following special characters:  Alt(%), Ctrl(^), Shift(+) and Enter(~) keys.

So, to send a CTRL and press the A key you would send:


If you need to perform the same keystroke multiple times, you can create a compound string argument. This will allow you to perform a specific keystroke and repeat it any number of times. To select, say, the 10th row in a grid control you might use:

mySendKeys.SendKeys(“{DOWN 10}”)

This will send the down key ten times. (For a more detailed explanation of SendKeys check out VBScript Programmer's Reference.)

Important – You’ll need to make sure that the application or object you wish to receive the keystroke has focus before sending the keystroke.

*Common issues with this method:

(Sometimes multiple keystrokes will not work. If this is the case, try executing each one in a separate line.)

3. Device Replay

This is an undocumented and unsupported QuickTest method, but can be used as a last resort. To employ this method, you’ll need to create a Device Replay object.(Check out the Device Replay Chart of Codes)

To tab off an object:

Dim myDeviceReplay
Set myDeviceReplay = CreateObject("Mercury.DeviceReplay")
myDeviceReplay.PressKey 15

*Remember that Device Replay uses ASCII characters
To send text you would use:

myDeviceReplay.SendString “This is my string”

To send an enter keystroke:

myDeviceReplay.PressKey 28 ‘ASCII code for enter

From The HP knowledge base:

The functions that can be used with the Device Replay object are (all coordinates are relative to the top left corner of the screen):

Function Description
MouseMove x, y Move the mouse to the screen coordinate (x,y).
MouseClick x, y, button Move the mouse to the screen coordinate (x,y) and click the button
(0=left; 1=middle; 2=right).
MouseDblClick x, y, button Move the mouse to the screen coordinate (x,y) and double-click the button
(0=left; 1=middle; 2=right).
DragAndDrop x, y, dropx, dropy, button Drag the mouse from screen coordinate (x,y) to (dropx,dropy) with the button
(0=left; 1=middle; 2=right) pressed.
PressKey key Press a key using the ASCII code of the key.
For example, Chr(13), vbCR and vbTab.
MouseDown x, y, button Press the mouse button on screen coordinate (x,y).
MouseUp x, y, button Release the mouse button on screen coordinate (x,y).
KeyDown key Press a key using the ASCII code of the key.
For example, Chr(13), vbCR and vbTab.
KeyUp key Release a key using the ASCII code of the key.
For example, Chr(13), vbCR and vbTab.
SendString string Type a string.

Since I posted this I recently came across some more Device Replay Key codes for the PressKey, Keydown, Keyup and PressNKeys that I’d like to share with you. These methods are particularly helpful in certain situations in which you need to perform an action using a code that does not have an ASCII equivalent. Check out my QTP Secret Code Chart Revealed for more info: http://www.joecolantonio.com/2011/07/19/qtp-secret-code-chart-revealed-for-devicereplay-presskey-keydown-keyup-and-pressnkeys/

Hope this helps.

Joyce Noel - November 11, 2010

Hi Joe, I love this website you created! <3

Eric - December 3, 2010

Dim mySendKey
set mySendKey = CreateObject(“WScript.shell”)

Should be

Dim mySendKey
set mySendKey = CreateObject(“WScript.shell”)

Daniel - June 7, 2011

Thanks Eric!

QTP Secret Code Chart Revealed For DeviceReplay PressKey, KeyDown, KeyUp and PressNKeys — Joe Colantonio -- Test Automation Geek | Bibliomaniac | Software Imagineer - July 19, 2011

[…] few months back, I posted an article outlining three different ways to use keyboard input in QTP. I recently came across some more Device Replay Key codes for the PressKey, Keydown, Keyup and […]

Anish Pillai - September 12, 2011

Thanks Joe.. Good Article. I didnt know about Device Replay

Farhana Ashraf - October 25, 2011

Hi Joe,

I used press key method that works for ie and doesn’t work for Fire fox. Given below is the code. Please help. I am using QTP 11.


Set enter_key_candidate = CreateObject(“Mercury.DeviceReplay”)
Set enter_key_recruiter = CreateObject(“Mercury.DeviceReplay”)

While Browser(“hwnd:=”& hwnd_ie).Page(“title:= .*Brazen.*”).WebEdit(“name:=.*chatInputBox”).Exist AND Browser(“hwnd:=”& hwnd_ff).Page(“title:= .*Brazen.*”).WebEdit(“name:=.*chatInputBox”).Exist

””””””’ie user types message
‘ If Browser(“hwnd:=”& hwnd_ie).Page(“title:= .*Brazen.*”).WebEdit(“name:=.*chatInputBox”).Exist Then
‘ Browser(“hwnd:=”& hwnd_ie).Page(“title:= .*Brazen.*”).WebEdit(“name:=.*chatInputBox”).Set “candidate message”&i+1
‘ Browser(“hwnd:=”& hwnd_ie).Page(“title:= .*Brazen.*”).WebEdit(“name:=.*chatInputBox”).Click
‘ enter_key_candidate.PressKey 28
‘ Browser(“hwnd:=”& hwnd_ie).Page(“title:= .*Brazen.*”).WebElement(“html id:=chatDiv”).Click

‘ End If
””””””’FF user types message
‘ If Browser(“hwnd:=”& hwnd_ff).Page(“title:= .*Brazen.*”).WebEdit(“name:=.*chatInputBox”).Exist Then
‘ Browser(“hwnd:=”& hwnd_ff).Page(“title:= .*Brazen.*”).WebEdit(“name:=.*chatInputBox”).Set “candidate message”&i+1
‘ Browser(“hwnd:=”& hwnd_ff).Page(“title:= .*Brazen.*”).WebEdit(“name:=.*chatInputBox”).Click
‘ enter_key_candidate.PressKey 28
‘ Browser(“hwnd:=”& hwnd_ff).Page(“title:= .*Brazen.*”).WebElement(“html id:=chatDiv”).Click

‘ End If


    Joe Colantonio - November 20, 2011

    Farhana Ashraf » Sorry not sure why this is happening. What happens if you do a quick QTP record against the object does QTP recognize it? Also Here are some additional points to keep in mind when working with Mozilla Firefox:

    You must be logged-in with Administrator privileges (or have write permissions to the browser’s installation folder) on the QuickTest Professional computer when launching Mozilla Firefox with QuickTest Professional for the first time. Adding QuickTest Professional support for Mozilla Firefox requires a file to be created in the browser’s installation folder.

    You can record tests on Microsoft Internet Explorer and run them on Mozilla Firefox. You cannot record tests on Mozilla Firefox if using versions lower than QuickTest 11, for which there are two ways to create tests to run on Mozilla Firefox on such lower versions:

    Record the test on Microsoft Internet Explorer.
    Use the keyword-driven methodology: create an object repository for your application using the Object Repository window (local object repository) or Object Repository Manager (shared object repository), and then add steps using the Keyword View or Step Generator. When you use the keyword-driven methodology, you can add objects using Mozilla Firefox if you want; you do not have to use Microsoft Internet Explorer.

    Tabbed browsing is not supported by QuickTest Professional for any browser type. In Mozilla Firefox, you must specifically configure your browser to open a new browser window instead of a new tab. This configuration is dependent on the nature of your application and therefore configuration instructions are not provided. In most cases, you can add objects to the object repository and run tests on the active browser tab, even if there are additional tabs currently open.

Icahn - November 10, 2011


I have Q I am working on hotkeys on web application with QTP 10, IE 6. My Code works in IE 6, but not working in IE6. I get error “Object is not supported ….
Here is the snippent of the code.. what could be wrong…
Set WshShell = CreateObject(“WScript.Shell”)
vhwnd=Browser(“Main Browser”).GetROProperty(“hwnd”)
Window(“hwnd:=”&vhwnd).activate —– This is where it is giving error
WshShell.SendKeys “%1”

    Joe Colantonio - November 20, 2011

    Icahn » I’m not sure – it should work for both. I’ve seen issues when IE8 has the ‘Enable Tabbed Browsing’ turned on. Anyone else have any ideas?

      Abhijeet - May 3, 2012

      This statement is not clear : “My Code works in IE 6, but not working in IE6”

      I’m assuming Icahn is trying to use IE8. For IE8, Browser(“”).GetROProperty(“hwnd”) will not provide the hwnd, it will have to be retrieved using native methods.

      You should try using the below code instead :


Kim Arild - November 16, 2011

im trying to push a key down in x sec to a program with this code :
Dim Wsh
Set Wsh = Wscript.CreateObject(“Wscript.Shell”)
Wsh.AppActivate “My App Title”
Wsh.KeyDown “Z”
Wsh.KeyUp “Z”

Whats Wrong With The Script ? :(
Tnx :D

    Joe Colantonio - November 18, 2011

    Kim Arild » HI Kim does this work for you?

    Const VK_Z = 44

    Set myDeviceReplay = CreateObject(“Mercury.DeviceReplay”)
    Window(“regexpwndtitle:=you app title”).Activate
    myDeviceReplay.KeyDown VK_Z
    wait 3
    myDeviceReplay.KeyUp VK_Z

      Kim Arild - September 18, 2012

      Get This Error :
      Active X cant create object:

saras - February 7, 2012

Browser(“Sign In”).Page(“Course Settings”).WebTable(“name:=Save Changes”).WebElement(“html tag:=TD”,”abs_x:=2″,”abs_y:=647 “).click

i am running the above script for clicking a webelement in my application.Still the button is not clicked.But the webpage opens correctly.The application I am using for script in .Net application.

    Joe Colantonio - February 11, 2012

    saras » Hi – have you tried using the fire event to trigger the click? If not check out my post on how to use the fire event Cheers~Joe

Anita - March 2, 2012

Hi Joe, thank you for the great website. Super helpful.
I’m wondering if you can help answering my question. Is there a way to limit the duration QTP click on a button? (Kim’s question is on holding sendkeys for 3 secs, mine is kind of the opposite). So I have the following code:
JavaWindow(“API GUI”).JavaList(“LBS:”).Select “basic”
JavaWindow(“API GUI”).JavaButton(“Submit”).Click

When QTP’s executing Submit code, it seems to be holding down the Submit button for too long, ends up mimicking a second click on the button after getting a response back.

Thank you for your help!

    Joe Colantonio - March 2, 2012

    Anita » Hi Anita – that is some odd behavior. I’m not aware of any setting in QTP that limits the amount of time a click is performed on a button. What happens if you use the fireevent instead to do the click? Does it behave the same way?

      Anita - March 2, 2012

      Thank you for the suggestion! I’ll try it. :)

        Anita - March 2, 2012

        Hi Joe, FireEvent for Java seems to have micMouseClick vs. “onclick” or “ondblclick”. Syntax for it is: object.FireEvent EventType, EventArguments()
        EventType is micMouseClick and
        EventArguments is: (per Help) Required. An array of Variant values. Any parameters of the event’s constructor except for the source and EventID. You can pass any Java constant that is used as one of the event’s constructor parameters using its string instead of its value. Enter the values in a comma separated list. If no additional parameters are required, you do not need to supply a value for the EventArguments argument.

        I don’t understand what it means or how to use this eventArguments. I tried the below and it doesn’t work :(
        JavaWindow(“WPP for HLAPIs v1.3:_2”).JavaList(“LBS:”).Select “basic”
        JavaWindow(“WPP for HLAPIs v1.3:_2”).JavaButton(“Submit”).FireEvent micMouseClick, 0

        Would you be able to explain a bit more on how to use FireEvent with micMouseClick? thanks!

          Anita - March 2, 2012

          oh, it gives an “Invalid number of parameters” error

          Joe Colantonio - March 2, 2012

          Anita » Sorry I assumed the java fireevent would be the same as a web objects fireevent — I’m not sure what the exact event arguments should be. I need to research it. In the meantime how about trying
          JavaButton.Object.doClick() instead of FireEvent. For example:

          JavaWindow(“WPP for HLAPIs v1.3:_2″).JavaButton(“Submit”).Object.doClick()

          I did verify this method works on my machine.

          Anita - March 5, 2012

          Thanks Joe! It works with Object.doClick().
          Out of curiosity, what’s QTP doing differently between JavaWindow(“WPP for HLAPIs v1.3:_2″).JavaButton(“Submit”).Object.doClick()
          and JavaWindow(“WPP for HLAPIs v1.3:_2″).JavaButton(“Submit”).Click ?

Ganesh Kodali - March 28, 2012

Dear Joe,
I try to set data in webedit field but it gets cleared after tabout to next object. Tried with sendkeys, type, Device replay. but no luck.
could you please provide solution
below url http://www.mscgva.ch/schedule.html
while entering Port of Load and Port of discharge

Thanks in advance

    Joe Colantonio - March 28, 2012

    Ganesh Kodali » Hi Ganesh – what data are you using for Port of Load and Port of discharge? This looks like a web application issue not a QTP issue. Make sure you are using valid data. When I manually enter bogus port names the text is cleared but if I enter a valid port like KANDLA,INDIA it works for me.

      Ganesh Kodali - March 29, 2012

      Hi Joe
      No doubt I am using correct data, but Web application works
      only with data fetched. If I enter Chennai application fetches
      “CHENNAI, INDIA (INMAA)” , should be selected and then proceed to next Singapore application fetches “SINGAPORE, SINGAPORE (SGSIN)” finally to click search
      Using QTP tried with webedit, sendkeys, type, Device replay to set data directly as “CHENNAI, INDIA (INMAA)”, “SINGAPORE, SINGAPORE (SGSIN)” it displays Please enter Port of loading or Port of discharge.
      Here issue is with web application its not straight forward for us to handle. Is there any tricky solution to handle. Whatever we do manually should be able to do using QTP.


        Ganesh - April 16, 2012

        Any clue on my query / problem.


          Joe Colantonio - April 20, 2012

          Ganesh » Sorry Ganesh I have not had time to look at this yet.

Abhishek - April 11, 2012

Hi Joe

I have Putty application to test and to enter any command it only recognises numpad enter key.

How I can press NUMPAD ENTER key using QTP..

I have tried .type, sendkey, presskey and also terminal Emulator addin.. but unable to succeed.

Can you pls guide here?

    Joe Colantonio - April 12, 2012

    Abhishek » Hi – this is trickier then I thought it would be. I’ve tried using {NUMPADENTER} and other things without success. Does anyone else know how to do this?

      Harshit Shrivastava - April 22, 2013

      Hi Joe,
      Thanks for creating an awesome website.
      I am trying automate a machine in which normal enter key and numpad enter key have different functions.
      If I record, both the enter keys show the same recorded VBScript code. Have you found out any way it can be done??

        Joe Colantonio - April 22, 2013

        Harshit Shrivastava » Thanks Harshit – not sure about the two different enter keys – you might be able to do it using Extended ASCII characters.

Prabhu - March 6, 2013

hi Joe,

i have assiged a virtual object in a webpage .but the page is scrolled a little bit up or down every time .

so please suggest a better solution to select the virtual object or else to scroll the page up inorder to make the virtual object available in the same location

palaksha - April 6, 2013

Hello Joe,
When I record java application in QTP11.0 for scripting (with java addin), the right mouse click contents are not selecting, it will open the right click but it does not select the the required field.
Kindly let me how to select it.
And another question is in the java scripting at QTP 11.0 , the java page opening but it not recording the object in the page, like selection radio button and java button.I try to spy those two tabs but spy is identifying.

Sweety - April 20, 2013

Hi Joe,
The issue that I am currently facing to click on the “save as” when I right click on a Link in a web page.

The link is a document which I need to save it in some location. I am using Qtp 11v.

Any help will be great.

Rosh - May 8, 2013

Hi Joe, I am trying to use sendkeys method to send ENTER.
set mySendKey = CreateObject(“WScript.shell”)

but the above code doesn’t send the enter key. is there any other way that I can make sure it works? Any idea?


Israel - July 31, 2013

Hi Joe: How to use Mouse Double Click using the Send or Type method? Kindly Advise

Manu Sharma - October 1, 2013

Hi Joe,

Is it possible to check which mnemonic is underlined after pressing the “Alt” key? In one of our scenarios, we need to verify whether character “b” is underlined when we press “Alt” key for a checkbox control. Any idea?


    Joe Colantonio - October 5, 2013

    I’m not sure when you spy on the control after pressing an Alt key is there any property that changes? If so you can check for that property in your test to confirm that the Alt occurred. I don’t know if there is an ASCII character you could look for that represents an underline character. Anyone else have any suggestions?

Anbarasu - October 22, 2013

I am writing a QTP function to send emails through Outlook 2007. I am unable to send the email programmatically using Outlook object because I am getting security Dialog Popup.
Keyboard shortcut to send Email from Outlook is Alt+s. How to press Alt+s using Presskey method.

Alfonso Flores - December 6, 2013

Please HELP!!!!!
I’ve been using in IE8 Grid a .fireevent “ondblclick” and a .set methods to enter data in a grid.
A IE had a lot of isues in many ways, we’ve migrated to Firefox 12.
Trying to call the same funtion, neither the .fireevent and .Set methods worked.

Have tried several ways to set the information using:

“set mySendKey = CreateObject(“WScript.shell”)
var1 = “Datatable (“parameter1”, “global”)
mySendKeys.SendKeys (var1)”
“myDeviceReplay.SendString var1”
without any success.
In both cases the var1 is entered VERY FAST! and only remains on the object the last 3 letters of such variable.
have tried one by one on a loop with “wait 1”

Please help!!!!!

Ragards and thank you!


pooja - December 28, 2013

I am using following command :-
set WshShell = CreateObject(“WScript.Shell”)
WshShell.SendKeys “{ENTER}”
WshShell.SendKeys “+:techstack”
I observed it is not writing ‘+’ symbol, the data written by script is “:techstack” instead of “+:techstack”
Please help me with this issue.

[BLOCKED BY STBV] Revealed: Four Secret Functions Hidden in QTP and UFT | Joe Colantonio - Selenium-UFT-QTP-SoapUI-ALM-LoadRunner & more - November 11, 2014

[…] I actually covered this functionality in my previous post, Three ways to use keyboard input using QTP/UFT. […]

anderson - July 11, 2016

someone can help me?
I can’t make the keyboard button PAUSE work.
What happnes?
i’m used this code :

wait 2
Set myReplay = creatobject (“Mercury.DeviceReplay”)
myReplay.PressKey 116 ‘PAUSE
wait 2

I need to clear the screen of Mainframe.

Sudharshana - October 13, 2016

Hi Joe,

I am using Jenkins slave and trying to run the scripts in a remote machine. I am having issue in executing the SendKeys or DeviceReplay steps (to enter data in a WebElement). There are executing only when i am logged into the Remote. Is there any other alternative?


Click here to add a comment

Leave a comment: