Click here to Skip to main content
15,884,099 members
Articles / Programming Languages / C#

Sending Input Messages to Other Windows or How To Win a Flash Game By Your Programming Skills

Rate me:
Please Sign up or sign in to vote.
3.12/5 (10 votes)
4 Jul 2006CPOL2 min read 61.1K   2.2K   47  
Library for sending input messages to other windows and links to libraries you need to take full control over any running window.
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace Remo
{
		/// <summary>
		/// Class for Sending Mouse and Keyboard events to ANY
		/// window in the system by a handle.
		/// </summary>
		public class TakeOver
		{

			private int handle;

			#region SendMessage Constants

			private const int WM_LBUTTONDOWN = 0x0201;
			private const int WM_LBUTTONUP   = 0x0202;
			private const int WM_LBUTTONDBLCLK = 0x0203; 
			private const int WM_RBUTTONDOWN = 0x0204;
			private const int WM_RBUTTONUP	 = 0x0205;
			private const int WM_RBUTTONDBLCLK = 0x0206;
			private const int WM_MOUSEMOVE   = 0x0200;

			private const int WM_KEYDOWN = 0x100;
			private const int WM_KEYUP = 0x0101;
			private const int WM_CHAR = 0x0102;

			#endregion SendMessage Constants

			#region Virtual Keys Constants
  
			public const int VK_0		   = 0x30;
			public const int VK_1		   = 0x31;
			public const int VK_2		   = 0x32;
			public const int VK_3		   = 0x33;
			public const int VK_4		   = 0x34;
			public const int VK_5		   = 0x35;
			public const int VK_6		   = 0x36;
			public const int VK_7		   = 0x37;
			public const int VK_8		   = 0x38;
			public const int VK_9		   = 0x39;
			public const int VK_A		   = 0x41;
			public const int VK_B		   = 0x42;
			public const int VK_C		   = 0x43;
			public const int VK_D		   = 0x44;
			public const int VK_E		   = 0x45;
			public const int VK_F		   = 0x46;
			public const int VK_G		   = 0x47;
			public const int VK_H		   = 0x48;
			public const int VK_I		   = 0x49;
			public const int VK_J		   = 0x4A;
			public const int VK_K		   = 0x4B;
			public const int VK_L		   = 0x4C;
			public const int VK_M		   = 0x4D;
			public const int VK_N		   = 0x4E;
			public const int VK_O		   = 0x4F;
			public const int VK_P		   = 0x50;
			public const int VK_Q		   = 0x51;
			public const int VK_R		   = 0x52;
			public const int VK_S		   = 0x53;
			public const int VK_T		   = 0x54;
			public const int VK_U		   = 0x55;
			public const int VK_V		   = 0x56;
			public const int VK_W		   = 0x57;
			public const int VK_X		   = 0x58;
			public const int VK_Y		   = 0x59;
			public const int VK_Z		   = 0x5A;

			public const int VK_BACK      =    0x08;
			public const int VK_TAB       =    0x09;
			public const int VK_CLEAR     =    0x0C;
			public const int VK_RETURN    =    0x0D;
			public const int VK_SHIFT     =    0x10;
			public const int VK_CONTROL   =    0x11;
			public const int VK_MENU      =    0x12;
			public const int VK_PAUSE     =    0x13;
			public const int VK_CAPITAL   =    0x14;
			public const int VK_KANA      =    0x15;
			public const int VK_HANGEUL   =    0x15;
			public const int VK_HANGUL    =    0x15;
			public const int VK_JUNJA     =    0x17;
			public const int VK_FINAL     =    0x18;
			public const int VK_HANJA     =    0x19;
			public const int VK_KANJI     =    0x19;
			public const int VK_ESCAPE    =    0x1B;
			public const int VK_CONVERT   =    0x1C;
			public const int VK_NONCONVERT=    0x1D;
			public const int VK_ACCEPT    =    0x1E;
			public const int VK_MODECHANGE=    0x1F;
			public const int VK_SPACE     =    0x20;
			public const int VK_PRIOR     =    0x21;
			public const int VK_NEXT      =    0x22;
			public const int VK_END       =    0x23;
			public const int VK_HOME      =    0x24;
			public const int VK_LEFT      =    0x25;
			public const int VK_UP        =    0x26;
			public const int VK_RIGHT     =    0x27;
			public const int VK_DOWN      =    0x28;
			public const int VK_SELECT    =    0x29;
			public const int VK_PRINT     =    0x2A;
			public const int VK_EXECUTE   =    0x2B;
			public const int VK_SNAPSHOT  =    0x2C;
			public const int VK_INSERT    =    0x2D;
			public const int VK_DELETE    =    0x2E;
			public const int VK_HELP      =    0x2F;
			public const int VK_LWIN      =    0x5B;
			public const int VK_RWIN      =    0x5C;
			public const int VK_APPS      =    0x5D;
			public const int VK_SLEEP     =    0x5F;
			public const int VK_NUMPAD0   =    0x60;
			public const int VK_NUMPAD1   =    0x61;
			public const int VK_NUMPAD2   =    0x62;
			public const int VK_NUMPAD3   =    0x63;
			public const int VK_NUMPAD4   =    0x64;
			public const int VK_NUMPAD5   =    0x65;
			public const int VK_NUMPAD6   =    0x66;
			public const int VK_NUMPAD7   =    0x67;
			public const int VK_NUMPAD8   =    0x68;
			public const int VK_NUMPAD9   =    0x69;
			public const int VK_MULTIPLY  =    0x6A;
			public const int VK_ADD       =    0x6B;
			public const int VK_SEPARATOR =    0x6C;
			public const int VK_SUBTRACT  =    0x6D;
			public const int VK_DECIMAL   =    0x6E;
			public const int VK_DIVIDE    =    0x6F;
			public const int VK_F1        =    0x70;
			public const int VK_F2        =    0x71;
			public const int VK_F3        =    0x72;
			public const int VK_F4        =    0x73;
			public const int VK_F5        =    0x74;
			public const int VK_F6        =    0x75;
			public const int VK_F7        =    0x76;
			public const int VK_F8        =    0x77;
			public const int VK_F9        =    0x78;
			public const int VK_F10       =    0x79;
			public const int VK_F11       =    0x7A;
			public const int VK_F12       =    0x7B;
			public const int VK_F13       =    0x7C;
			public const int VK_F14       =    0x7D;
			public const int VK_F15       =    0x7E;
			public const int VK_F16       =    0x7F;
			public const int VK_F17       =    0x80;
			public const int VK_F18       =    0x81;
			public const int VK_F19       =    0x82;
			public const int VK_F20       =    0x83;
			public const int VK_F21       =    0x84;
			public const int VK_F22       =    0x85;
			public const int VK_F23       =    0x86;
			public const int VK_F24       =    0x87;
			public const int VK_NUMLOCK   =    0x90;
			public const int VK_SCROLL    =    0x91;

			#endregion Virtual Keys Constants

			[DllImport("user32.dll", CharSet=CharSet.Auto)]
			private static extern int SendMessage(int hWnd, int msg, int wParam, IntPtr lParam);
			[DllImport("user32.dll", CharSet=CharSet.Auto)] // used for button-down & button-up
			private static extern int PostMessage(int hWnd, int msg, int wParam, IntPtr lParam);
			[DllImport("user32.dll", CharSet=CharSet.Auto)]
			private static extern bool SetForegroundWindow(IntPtr hWnd);


			public TakeOver(int handle)
			{
				this.handle = handle;
			}

			public void SetFocus() 
			{
				SetForegroundWindow(new IntPtr(this.handle));
			}

			public void SendLeftButtonDown(int x,int y) 
			{
				PostMessage(handle,WM_LBUTTONDOWN,0,new IntPtr(y * 0x10000 + x));
			}

			public void SendLeftButtonUp(int x,int y) 
			{
				PostMessage(handle,WM_LBUTTONUP,0,new IntPtr(y * 0x10000 + x));
			}

			public void SendLeftButtonDblClick(int x,int y) 
			{
				PostMessage(handle,WM_LBUTTONDBLCLK,0,new IntPtr(y * 0x10000 + x));
			}

			public void SendRightButtonDown(int x,int y) 
			{
				PostMessage(handle,WM_RBUTTONDOWN,0,new IntPtr(y * 0x10000 + x));
			}

			public void SendRightButtonUp(int x,int y) 
			{
				PostMessage(handle,WM_RBUTTONUP,0,new IntPtr(y * 0x10000 + x));
			}

			public void SendRightButtonDblClick(int x,int y) 
			{
				PostMessage(handle,WM_RBUTTONDBLCLK,0,new IntPtr(y * 0x10000 + x));
			}
			
			public void SendMouseMove(int x,int y) 
			{
				PostMessage(handle,WM_MOUSEMOVE,0,new IntPtr(y * 0x10000 + x));
			}

			public void SendKeyDown(int key) 
			{
				PostMessage(handle,WM_KEYDOWN,key,IntPtr.Zero);
			}
			
			public void SendKeyUp(int key) 
			{
				PostMessage(handle,WM_KEYUP,key,new IntPtr(1));
			}

			public void SendChar(char c)
			{
				SendMessage(handle, WM_CHAR, c, IntPtr.Zero);
			}
			
			public void SendString(string s)
			{
				foreach (char c in s) SendChar(c);
			}
		}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
Slovakia Slovakia
I am one step before graduating Faculty of Mathematics, Physics and Informatics, Commenius University Bratislava, specialization Computer Graphics. Working as C# programmer on large IS. Creator of Ubytovanie na Slovensku site.

Comments and Discussions