Gå til innhold

C#: Automatisere MS Paint muse bevegelse.


Anbefalte innlegg

Skrevet (endret)

Hei hei!

 

 

Prøver å få till en liten kodesnutt jeg har funnet på nettet som beskriver Control mouse programmatically orginalt skrevet i C++, som jeg har så skrevet om til C#. Tingen er at jeg klarer bare ikke å få den til å fungere.

 

 

Jeg klarer å gjøre gitt oppgave om jeg ligger ved mouse_event, men da tar den fysisk kontroll over min muse peker. Med denne koden skal det være mulig å jobbe med maskin mens ett bilde vill tegnes i mspaint. I dette tilfelle en spiral.

 

 

Er det noe jeg har glemt?

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Drawing;
namespace ConsoleApplication1
{
class Helpers
{
	[DllImport("user32.dll")]
	public static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);
	[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
	public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, Int32 wParam, Int32 lParam);
	public static int MakeLParam(Point ptr)
	{
		return ((ptr.Y &--#60;&--#60; 16) | (ptr.X & 0xffff));
	}
}
class Program
{
	static void Main(string[] args)
	{
		Process proc = Process.GetProcessesByName("mspaint").FirstOrDefault();
		try
		{
			int px;
			int py;
			bool firstPoint = true;
			for (double i = 0; i &--#60; 1; i += 0.001)
			{
				double rad = 10 * 2 * 3.14 * i;
				double x = Math.Cos(rad) * 100 * i;
				double y = Math.Sin(rad) * 100 * i;
				px = (int)x + 300;
				py = (int)y + 300;
				if (firstPoint)
				{
					Helpers.PostMessage(proc.MainWindowHandle, (uint)WMessages.WM_LBUTTONDOWN | (uint)VKeys.VK_LBUTTON, (int)0x1, (int)Helpers.MakeLParam(new Point(px, py)));
					firstPoint = false;
				}
				Helpers.PostMessage(proc.MainWindowHandle, (uint)WMessages.WM_LBUTTONDOWN, (int)VKeys.VK_LBUTTON, (int)Helpers.MakeLParam(new Point(px, py)));
				Thread.Sleep(10);
			}
		}
		catch (Exception ex)
		{
			Console.WriteLine(ex.Message);
		}
	}
}
#region Enumeration
/// &--#60;summary&--#62;
/// Virtual Keys
/// &--#60;/summary&--#62;
public enum VKeys : int
{
	VK_LBUTTON = 0x01,   //Left mouse button
	VK_RBUTTON = 0x02,   //Right mouse button
	VK_CANCEL = 0x03,   //Control-break processing
	VK_MBUTTON = 0x04,   //Middle mouse button (three-button mouse)
	VK_BACK = 0x08,   //BACKSPACE key
	VK_TAB = 0x09,   //TAB key
	VK_CLEAR = 0x0C,   //CLEAR key
	VK_RETURN = 0x0D,   //ENTER key
	VK_SHIFT = 0x10,   //SHIFT key
	VK_CONTROL = 0x11,   //CTRL key
	VK_MENU = 0x12,   //ALT key
	VK_PAUSE = 0x13,   //PAUSE key
	VK_CAPITAL = 0x14,   //CAPS LOCK key
	VK_ESCAPE = 0x1B,   //ESC key
	VK_SPACE = 0x20,   //SPACEBAR
	VK_PRIOR = 0x21,   //PAGE UP key
	VK_NEXT = 0x22,   //PAGE DOWN key
	VK_END = 0x23,   //END key
	VK_HOME = 0x24,   //HOME key
	VK_LEFT = 0x25,   //LEFT ARROW key
	VK_UP = 0x26,   //UP ARROW key
	VK_RIGHT = 0x27,   //RIGHT ARROW key
	VK_DOWN = 0x28,   //DOWN ARROW key
	VK_SELECT = 0x29,   //SELECT key
	VK_PRINT = 0x2A,   //PRINT key
	VK_EXECUTE = 0x2B,   //EXECUTE key
	VK_SNAPSHOT = 0x2C,   //PRINT SCREEN key
	VK_INSERT = 0x2D,   //INS key
	VK_DELETE = 0x2E,   //DEL key
	VK_HELP = 0x2F,   //HELP key
	VK_OEMCOMMA = 0xBC, //OEMComma
	VK_0 = 0x30,   //0 key
	VK_1 = 0x31,   //1 key
	VK_2 = 0x32,   //2 key
	VK_3 = 0x33,   //3 key
	VK_4 = 0x34,   //4 key
	VK_5 = 0x35,   //5 key
	VK_6 = 0x36,	//6 key
	VK_7 = 0x37,	//7 key
	VK_8 = 0x38,   //8 key
	VK_9 = 0x39,	//9 key
	VK_A = 0x41,   //A key
	VK_B = 0x42,   //B key
	VK_C = 0x43,   //C key
	VK_D = 0x44,   //D key
	VK_E = 0x45,   //E key
	VK_F = 0x46,   //F key
	VK_G = 0x47,   //G key
	VK_H = 0x48,   //H key
	VK_I = 0x49,	//I key
	VK_J = 0x4A,   //J key
	VK_K = 0x4B,   //K key
	VK_L = 0x4C,   //L key
	VK_M = 0x4D,   //M key
	VK_N = 0x4E,	//N key
	VK_O = 0x4F,   //O key
	VK_P = 0x50,	//P key
	VK_Q = 0x51,   //Q key
	VK_R = 0x52,   //R key
	VK_S = 0x53,   //S key
	VK_T = 0x54,   //T key
	VK_U = 0x55,   //U key
	VK_V = 0x56,   //V key
	VK_W = 0x57,   //W key
	VK_X = 0x58,   //X key
	VK_Y = 0x59,   //Y key
	VK_Z = 0x5A,	//Z key
	VK_NUMPAD0 = 0x60,   //Numeric keypad 0 key
	VK_NUMPAD1 = 0x61,   //Numeric keypad 1 key
	VK_NUMPAD2 = 0x62,   //Numeric keypad 2 key
	VK_NUMPAD3 = 0x63,   //Numeric keypad 3 key
	VK_NUMPAD4 = 0x64,   //Numeric keypad 4 key
	VK_NUMPAD5 = 0x65,   //Numeric keypad 5 key
	VK_NUMPAD6 = 0x66,   //Numeric keypad 6 key
	VK_NUMPAD7 = 0x67,   //Numeric keypad 7 key
	VK_NUMPAD8 = 0x68,   //Numeric keypad 8 key
	VK_NUMPAD9 = 0x69,   //Numeric keypad 9 key
	VK_SEPARATOR = 0x6C,   //Separator key
	VK_SUBTRACT = 0x6D,   //Subtract key
	VK_DECIMAL = 0x6E,   //Decimal key
	VK_DIVIDE = 0x6F,   //Divide key
	VK_F1 = 0x70,   //F1 key
	VK_F2 = 0x71,   //F2 key
	VK_F3 = 0x72,   //F3 key
	VK_F4 = 0x73,   //F4 key
	VK_F5 = 0x74,   //F5 key
	VK_F6 = 0x75,   //F6 key
	VK_F7 = 0x76,   //F7 key
	VK_F8 = 0x77,   //F8 key
	VK_F9 = 0x78,   //F9 key
	VK_F10 = 0x79,   //F10 key
	VK_F11 = 0x7A,   //F11 key
	VK_F12 = 0x7B,   //F12 key
	VK_SCROLL = 0x91,   //SCROLL LOCK key
	VK_LSHIFT = 0xA0,   //Left SHIFT key
	VK_RSHIFT = 0xA1,   //Right SHIFT key
	VK_LCONTROL = 0xA2,   //Left CONTROL key
	VK_RCONTROL = 0xA3,	//Right CONTROL key
	VK_LMENU = 0xA4,	  //Left MENU key
	VK_RMENU = 0xA5,   //Right MENU key
	VK_PLAY = 0xFA,   //Play key
	VK_ZOOM = 0xFB, //Zoom key
}
public enum MKMessages : int
{
	MK_LBUTTON = 0x0001
}
///&--#60;summary&--#62;
/// Virtual Messages
/// &--#60;/summary&--#62;
public enum WMessages : int
{
	WM_SETCURSOR = 0x0020,
	WM_MOUSEMOVE = 0x200, //Simulate mouse move.
	WM_MOUSEHOVER = 0x2A1,
	WM_ACTIVATE = 0x021,
	WM_LBUTTONDOWN = 0x201, //Left mousebutton down
	WM_LBUTTONUP = 0x202,  //Left mousebutton up
	WM_LBUTTONDBLCLK = 0x203, //Left mousebutton doubleclick
	WM_RBUTTONDOWN = 0x204, //Right mousebutton down
	WM_RBUTTONUP = 0x205,   //Right mousebutton up
	WM_RBUTTONDBLCLK = 0x206, //Right mousebutton doubleclick
	WM_KEYDOWN = 0x100,  //Key down
	WM_KEYUP = 0x101,   //Key up
	WM_CHAR = 0x105,
}
///summary&--#62;
/// Virtual Mouse Event Flags
/// &--#60;/summary&--#62;
public enum MouseEventFlags : uint
{
	LEFTDOWN = 0x00000002,
	LEFTUP = 0x00000004,
	MIDDLEDOWN = 0x00000020,
	MIDDLEUP = 0x00000040,
	MOVE = 0x00000001,
	ABSOLUTE = 0x00008000,
	RIGHTDOWN = 0x00000008,
	RIGHTUP = 0x00000010,
	WHEEL = 0x00000800,
	XDOWN = 0x00000080,
	XUP = 0x00000100
}
#endregion
}

Endret av j0achim
Videoannonse
Annonse
Skrevet

Sjekk om det funker dersom du starter programmet ditt som administrator.

Mener at man ikke kan poste meldinger til andre programmer på den måten uten videre etter Windows Vista, uten at jeg er 100% sikker.

Skrevet (endret)

Etter mer frem og tilbake, og se bedre på kode slik som i exempel jeg hadde oversatt la jeg merke til at jeg ikke hadde gjort noe for å få tak i child handles.

 

Nå har jeg ikke oversatt koden som ble brukt for å få tak i riktig handle, men jeg benyttet meg av Spy++ og sendte PostMessage direkte til handle som benyttes av mspaint som draw area. Og jammen da fikk jeg resultater! :)

Endret av j0achim

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...