15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2010 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_FRAME_TEST_SIMULATE_INPUT_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_FRAME_TEST_SIMULATE_INPUT_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
12a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/process/process_handle.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace simulate_input {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum Modifier {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NONE,
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHIFT = 1,
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CONTROL = 2,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ALT = 4
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum KeyMode {
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  KEY_DOWN,
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  KEY_UP,
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Bring a window into foreground to receive user input.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that this may not work on
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ForceSetForegroundWindow(HWND window);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Looks for a top level window owned by the given process id and
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// calls ForceSetForegroundWindow on it.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool EnsureProcessInForeground(base::ProcessId process_id);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper function to set keyboard focus to a window. This is achieved by
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sending a mouse move followed by a mouse down/mouse up combination to the
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// window.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetKeyboardFocusToWindow(HWND window);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Sends a keystroke to the currently active application with optional modifiers
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// set. Sends one "key (down|up)" input event for each modifier set, plus one
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// for |mnemonic_char| depending on the value of |key_mode|. This can be useful
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// as it has been observed that tests will exit after receiving the "key down"
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// events leaving the keyboard in an inconsistent state.
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SendMnemonic(WORD mnemonic_char, uint32 modifiers, bool extended,
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  bool unicode, KeyMode key_mode);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sends a mouse click to the desktop.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum MouseButton { LEFT, RIGHT, MIDDLE, X };
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SendMouseClick(int x, int y, MouseButton button);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sends a mouse click to the window passed in, after ensuring that the window
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is in the foreground.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SendMouseClick(HWND window, int x, int y, MouseButton button);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Translates a single char to a virtual key.
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SendScanCode(short scan_code, uint32 modifiers);
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SendCharA(char c, uint32 modifiers);
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SendCharW(wchar_t c, uint32 modifiers);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sends extended keystroke to the currently active application with optional
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modifiers set.
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SendExtendedKey(WORD key, uint32 modifiers);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Iterates through all the characters in the string and simulates
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// keyboard input.  The input goes to the currently active application.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SendStringW(const std::wstring& s);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SendStringA(const std::string& s);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // end namespace simulate_input
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_FRAME_TEST_SIMULATE_INPUT_H_
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74