{"id":814,"date":"2010-08-15T16:03:13","date_gmt":"2010-08-15T15:03:13","guid":{"rendered":"http:\/\/morony.pl\/?p=814"},"modified":"2010-08-15T16:03:13","modified_gmt":"2010-08-15T15:03:13","slug":"klikasz-no-ba","status":"publish","type":"post","link":"https:\/\/morony.pl\/?p=814","title":{"rendered":"Klikasz? No ba!"},"content":{"rendered":"<p>Kolejny prosty i przydatny programik, kt\u00f3ry mo\u017cna szybko napisa\u0107 w C#. Celem jest symulowanie klikni\u0119\u0107 myszk\u0105. Zak\u0142adaj\u0105c, \u017ce z jakiego\u015b powodu musimy wykona\u0107 kilkaset czy kilka tysi\u0119cy klikni\u0119\u0107 mo\u017ce si\u0119 okaza\u0107 niezast\u0105piony.<\/p>\n<p>Zacznijmy od koniecznej podstawy do dalszych dzia\u0142a\u0144. Poni\u017cej znajduje si\u0119 kompletny kod, kt\u00f3ry zapewni mo\u017cliwo\u015b\u0107 manipulacji myszk\u0105:<\/p>\n<pre class=\"prettyprint\">using System;\r\nusing System.Windows.Forms;\r\nusing System.Runtime.InteropServices;\r\n\r\nnamespace MultiClick\r\n{\r\n    public partial class Form1 : Form\r\n    {\r\n        \/\/ \u0141adujemy bibliotek\u0119 user32.dll\r\n        [DllImport(\"user32.dll\", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]\r\n\r\n        \/\/ B\u0119dziemy korzysta\u0107 z funkcji mouse_event z za\u0142adownej biblioteki\r\n        public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);\r\n        \r\n        \/\/ B\u0119dziemy potrzebowa\u0107 kody r\u00f3\u017cnych zdarze\u0144 zwi\u0105znych z myszk\u0105\r\n        public enum MouseEventFlags\r\n        {\r\n            LEFTDOWN = 0x00000002,\r\n            LEFTUP = 0x00000004,\r\n            MIDDLEDOWN = 0x00000020,\r\n            MIDDLEUP = 0x00000040,\r\n            MOVE = 0x00000001,\r\n            ABSOLUTE = 0x00008000,\r\n            RIGHTDOWN = 0x00000008,\r\n            RIGHTUP = 0x00000010\r\n        }\r\n\r\n        public Form1()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>Pierwsz\u0105 rzecz\u0105, kt\u00f3rej warto si\u0119 nauczy\u0107 to odczytywanie pozycji kursora. Przyda si\u0119 to do p\u00f3\u017aniejszego celowania. <\/p>\n<p>Potrzebujemy przycisk i dwa pola tekstowe. Poni\u017cszy kod wpisuje wsp\u00f3\u0142rz\u0119dne kursora po klikni\u0119ciu przycisku. Oczywi\u015bcie nale\u017cy uaktywni\u0107 przycisk (np. przechodz\u0105c do niego tabulatorem) i wcisn\u0105\u0107 spacj\u0119 w momencie, w kt\u00f3rym chcemy spisa\u0107 wsp\u00f3\u0142rz\u0119dne kursora. Mo\u017cna to rozwi\u0105za\u0107 inaczej, ale ten przyk\u0142ad mia\u0142 by\u0107 prosty. Wracaj\u0105c do kodu:<\/p>\n<pre class=\"prettyprint\">        private void button1_Click(object sender, EventArgs e)\r\n        {\r\n            int X = Cursor.Position.X;\r\n            int Y = Cursor.Position.Y;\r\n            textBox1.Text = X.ToString();\r\n            textBox2.Text = Y.ToString();\r\n        }<\/pre>\n<p>Jak ju\u017c wiemy gdzie chcemy dzia\u0142a\u0107 myszk\u0105 &#8211; do dzie\u0142a. Czas zacz\u0105\u0107 klika\u0107. Napisa\u0142em sobie dwie funkcje.<\/p>\n<p>Za klikni\u0119cie lewym klawiszem odpowiada funkcja <strong>LeftClick<\/strong>, kt\u00f3ra przyjmuje jako argumenty wsp\u00f3\u0142rz\u0119dne punktu. <\/p>\n<pre class=\"prettyprint\">        public static void LeftClick(int x, int y)\r\n        {\r\n            \/\/ Ustawiamy kursor w punkcie x, y\r\n            Cursor.Position = new System.Drawing.Point(x, y);\r\n            \/\/ Symulujemy wcisni\u0119cie lewego przycisku myszy\r\n            mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0);\r\n            \/\/ Symulujemy puszczenie lewego przycisku myszy\r\n            mouse_event((int)(MouseEventFlags.LEFTUP), 0, 0, 0, 0);\r\n        }<\/pre>\n<p>Za przeci\u0105gni\u0119cie elementu odpowiada funkcja <strong>LeftDrag<\/strong>, kt\u00f3ra przyjmuje jako argumenty wsp\u00f3\u0142rz\u0119dne dw\u00f3ch punkt\u00f3w.<\/p>\n<pre class=\"prettyprint\">        public static void LeftDrag(int x, int y, int x2, int y2)\r\n        {\r\n            Cursor.Position = new System.Drawing.Point(x, y);\r\n            mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0);\r\n            Cursor.Position = new System.Drawing.Point(x2, y2);\r\n            mouse_event((int)(MouseEventFlags.LEFTUP), 0, 0, 0, 0);\r\n        }<\/pre>\n<p>Teraz wystarczy sklei\u0107 powy\u017csze kawa\u0142ki kodu i napisa\u0107 program (kod), kt\u00f3ry b\u0119dzie klika\u0142. Ja dla przyk\u0142adu utworzy\u0142em przycisk, kt\u00f3rego klikni\u0119cie spowoduje narysowanie &#8220;rysunku&#8221; w paincie:<br \/>\n<center><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/morony.pl\/wp-content\/uploads\/2010\/08\/2010-08-15_165733.png\" alt=\"\" title=\"Rysunek z Painta\" width=\"187\" height=\"187\" class=\"alignnone size-full wp-image-822\" srcset=\"https:\/\/morony.pl\/wp-content\/uploads\/2010\/08\/2010-08-15_165733.png 187w, https:\/\/morony.pl\/wp-content\/uploads\/2010\/08\/2010-08-15_165733-150x150.png 150w\" sizes=\"(max-width: 187px) 100vw, 187px\" \/><\/center><\/p>\n<p>Kod potrzebny do wygenerowania rysunku wygl\u0105da nast\u0119puj\u0105co:<\/p>\n<pre class=\"prettyprint\">        private void button2_Click(object sender, EventArgs e)\r\n        {\r\n            LeftDrag(300, 300, 300, 480);\r\n            LeftDrag(300, 480, 480, 480);\r\n            LeftDrag(480, 480, 480, 300);\r\n            LeftDrag(480, 300, 300, 300);\r\n            for (int x = 0; x < 18; x++)\r\n            {\r\n                for (int y = 0; y < 18; y++)\r\n                {\r\n                    LeftClick(300 + y * 10, 300 + x * 10);\r\n                }\r\n            }\r\n        }<\/pre>\n<p>I to tyle. Dalsze wariacje w temacie zostawiam czytelnikom.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kolejny prosty i przydatny programik, kt\u00f3ry mo\u017cna szybko napisa\u0107 w C#. Celem jest symulowanie klikni\u0119\u0107 myszk\u0105. Zak\u0142adaj\u0105c, \u017ce z jakiego\u015b powodu musimy wykona\u0107 kilkaset czy kilka tysi\u0119cy klikni\u0119\u0107 mo\u017ce si\u0119 okaza\u0107 niezast\u0105piony. Zacznijmy od koniecznej podstawy do dalszych dzia\u0142a\u0144. Poni\u017cej znajduje si\u0119 kompletny kod, kt\u00f3ry zapewni mo\u017cliwo\u015b\u0107 manipulacji myszk\u0105: using System; using System.Windows.Forms; using System.Runtime.InteropServices; [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,1],"tags":[],"_links":{"self":[{"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/posts\/814"}],"collection":[{"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/morony.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=814"}],"version-history":[{"count":12,"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/posts\/814\/revisions"}],"predecessor-version":[{"id":830,"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/posts\/814\/revisions\/830"}],"wp:attachment":[{"href":"https:\/\/morony.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=814"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/morony.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=814"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/morony.pl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=814"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}