Watch me figure this out soon as I post this...
I spent many-a-hour looking for a solution to this...
I'm loading a Flash application that has a button into my C# winform using the WebBrowser control. I want to be able to click the button on the Flash Application by clicking a winform button or hitting a keyboard key. I searched google and found this:
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);
}
}
In theory I should be able to do this:
TakeOver takeover;
public MainForm()
{
InitializeComponent();
takeover = new TakeOver(webBrowser.Handle.ToInt32());
}
private void btnNext_Click(object sender, EventArgs e)
{
takeover.SetFocus();
takeover.SendLeftButtonDown(30, 70);
//System.Threading.Thread.Sleep(1000);
takeover.SendLeftButtonUp(30, 70);
}
But it won't work. I've had it click on different things, like different winform buttons and panels and stuff, and it seems to work fine with them. I even tried to throw in the Thread sleep thing, to see if it was just clicking to fast... but nope... no good.
Anyone have an alternitive? if I could even load the SWF file and have my program tell it to click the button or whatever, I guess that would work, but all I could find for that is WHAT is in the SWF file (like how many buttons and stuff like that) but nothing that will letme force a button to click.
Thanks!
[center]
