NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    기타 3부 - 언어별 그림판에 마우스 클릭하기. (Click the mouse on the language-specific MSpa…

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 언어별 클래스에 대해 알아보기 전 가벼운 마음으로 마우스 클릭에 대해 알아볼께요^^

     

    1. C for Visual Studio 2019

    #include <windows.h>
    
    void MouseMove()
    {
        SetCursorPos(300, 300);
    }
    
    void MouseLeftClick()
    {
        INPUT    Input = { 0 };
    
        // Left down
        Input.type = INPUT_MOUSE;
        Input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
        SendInput(1, &Input, sizeof(INPUT));
    
        // Left up
        ZeroMemory(&Input, sizeof(INPUT));
        Input.type = INPUT_MOUSE;
        Input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
        SendInput(1, &Input, sizeof(INPUT));
    }
    
    int main(VOID)
    {
        MouseMove();
        MouseLeftClick();
    }

    6N6Voot.gif

     

     

    이 코드를 실행하면 마우스가 정상 동작하는건 확인할 수 있습니다. 다만, 콘솔창이 표시되서 그림판에 클릭이 안되고 있네요. 코드를 아래와 같이 변경하고 다시 해보세요. 콘솔창이 표시되지 않고 마우스가 그림판을 클릭합니다. C 프로젝트의 속성에서 서브시스템을 콘솔이 아닌 윈도우로 변경해야 합니다.

    #include <windows.h>
    
    void MouseMove()
    {
        SetCursorPos(300, 300);
    }
    
    void MouseLeftClick()
    {
        INPUT    Input = { 0 };
    
        // Left down
        Input.type = INPUT_MOUSE;
        Input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
        SendInput(1, &Input, sizeof(INPUT));
    
        // Left up
        ZeroMemory(&Input, sizeof(INPUT));
        Input.type = INPUT_MOUSE;
        Input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
        SendInput(1, &Input, sizeof(INPUT));
    }
    
    int CALLBACK WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
    {
        MouseMove();
        MouseLeftClick();
    }

    e1rEZhE.gif

     

     

    2. C++ for Visual Studio 2019

    C와 코드가 동일합니다. 프로젝트를 만들 때 콘솔로 만들었기 때문에 링커의 시스템에서 윈도우로 변경하세요.

    // ConsoleApplication1.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
    //
    
    #include <iostream>
    #include <Windows.h>
    
    void MouseMove()
    {
        SetCursorPos(300, 300);
    }
    
    void MouseLeftClick()
    {
        INPUT    Input = { 0 };
    
        // Left down
        Input.type = INPUT_MOUSE;
        Input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
        ::SendInput(1, &Input, sizeof(INPUT));
    
        // Left up
        ::ZeroMemory(&Input, sizeof(INPUT));
        Input.type = INPUT_MOUSE;
        Input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
        ::SendInput(1, &Input, sizeof(INPUT));
    }
    
    int CALLBACK WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
    {
        MouseMove();
        MouseLeftClick();
    }
    
    // 프로그램 실행: <Ctrl+F5> 또는 [디버그] > [디버깅하지 않고 시작] 메뉴
    // 프로그램 디버그: <F5> 키 또는 [디버그] > [디버깅 시작] 메뉴
    
    // 시작을 위한 팁: 
    //   1. [솔루션 탐색기] 창을 사용하여 파일을 추가/관리합니다.
    //   2. [팀 탐색기] 창을 사용하여 소스 제어에 연결합니다.
    //   3. [출력] 창을 사용하여 빌드 출력 및 기타 메시지를 확인합니다.
    //   4. [오류 목록] 창을 사용하여 오류를 봅니다.
    //   5. [프로젝트] > [새 항목 추가]로 이동하여 새 코드 파일을 만들거나, [프로젝트] > [기존 항목 추가]로 이동하여 기존 코드 파일을 프로젝트에 추가합니다.
    //   6. 나중에 이 프로젝트를 다시 열려면 [파일] > [열기] > [프로젝트]로 이동하고 .sln 파일을 선택합니다.
    

    WraAp6Z.gif

     

     

    3. C# for Visual Studio 2019 (Core & .NET)

    C#의 경우에는 Core와 .NET 설정이 다릅니다. Core의 경우 플랫폼에 종속되지 않기 위해 닷넷 프레임워크에서 제공하는 Windows 관련 라이브러리를 사용할 수 없습니다. 물론, 프로젝트 파일에서 직접 설정하면 유용한 함수들을 쉽게 사용할 수 있지만 다른 플랫폼(리눅스, 맥)에서 프로그램이 동작하지 않게 되는 단점이 있습니다.

    using System;
    using System.Runtime.InteropServices;
    
    namespace ConsoleApp1
    {
        class Program
        {
    		const int InputMouse = 0;
    		const int MouseEventMove = 0x01;
    		const int MouseEventAbsolute = 0x8000;
    		const int MouseEventLeftDown = 0x02;
    		const int MouseEventLeftUp = 0x04;
    
    		[DllImport("user32.dll", SetLastError = true)]
            private static extern uint SendInput(uint numInputs, Input[] inputs, int size);
    
    		internal struct MouseInput
            {
                public int X;
                public int Y;
                public uint MouseData;
                public uint Flags;
                public uint Time;
                public IntPtr ExtraInfo;
            }
    
            internal struct Input
            {
                public int Type;
                public MouseInput MouseInput;
            }
    
            static void Main(string[] args)
            {
    			MouseLeftClick();
    		}
    
    		static void MouseLeftClick()
    		{
    			Input[] inputs = new Input[2];
    
    			inputs[0] = new Input();
    			inputs[0].Type = InputMouse;
    			inputs[0].MouseInput.X = (300 * 65535) / System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;
    			inputs[0].MouseInput.Y = (300 * 65535) / System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;
    			inputs[0].MouseInput.Flags = MouseEventAbsolute | MouseEventMove;
    
    			inputs[1] = new Input();
    			inputs[1].Type = InputMouse;
    			inputs[1].MouseInput.Flags = MouseEventLeftDown;
    
    			SendInput(2, inputs, Marshal.SizeOf(inputs[0]));
    
    			inputs = new Input[1];
    
    			inputs[0] = new Input();
    			inputs[0].Type = InputMouse;
    			inputs[0].MouseInput.Flags = MouseEventLeftUp;
    
    			SendInput(2, inputs, Marshal.SizeOf(inputs[0]));
    		}
    	}
    }

     

    C#은 윈도우 API를 직접 사용할 수 없습니다. 윈도우 API를 dll로 import한 후 extern을 이용해서 해당 dll의 함수를 호출해야 합니다. extern 한정자는 외부에서 구현된 메소드를 선언하는 데 사용됩니다. extern 한정자는 일반적으로 Interop 서비스를 사용하여 비관리 코드를 호출할 때 DllImport 특성과 함께 사용됩니다. 이 경우 메소드를 static으로 선언해야 합니다.

     

    4. Java for Eclipse Enterprise

    자바는 마우스나 키보드를 윈도우에 입력할 수 있는 Robot 패키지를 제공하므로 C#보다는 쉽게 사용할 수 있습니다. C#도 누군가가 만들어놓은 수많은 라이브러리가 존재하므로, 자신에게 맞는 것을 잘 찾아서 사용한다면 코드 몇줄로 처리가 가능합니다. 여러분들도 알다시피 개발자가 주로 하는 일은 원하는 기능이 구현된 라이브러리나 패키지가 있는지 찾아보고, 있으면 테스트하고 적용 가능한지 파악 합니다. 마지막으로 라이센스 정책도 파악하죠^^;

    import java.awt.AWTException;
    import java.awt.Robot;
    import java.awt.event.InputEvent;
    
    public class main {
    	public static void main(String[] args) {
    		try {
    			mouseLeftClick();
    		} catch (AWTException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	
    	public static void mouseLeftClick() throws AWTException{
    		  Robot bot = new Robot();
    		  bot.mouseMove(300, 300);    
    		  bot.mousePress(InputEvent.BUTTON1_MASK);
    		  bot.mouseRelease(InputEvent.BUTTON1_MASK);
    		}
    }

    wxgt2ex.gif

     

     

    5. Python for Visual Studio Code

    파이썬은 pyautogui 패키지를 사용하면 쉽게~ 마우스와 키보드를 윈도우에 입력할 수 있습니다.

    import pyautogui
    
    def mouseLeftClick():
        pyautogui.moveTo(300, 300)
        pyautogui.click()
    
    mouseLeftClick()

    R3eHYeO.gif

     

     

    6. JavaScript for Visual Studio Code

    자바스크립트는 윈도우에 마우스나 키보드를 입력할 수 없습니다. 당연한 말이지만~ 웹브라우저에 종속되어 실행되는 언어이기 때문입니다. 예전에는 ActiveX를 브라우저에 심어서 윈도우를 제어할 수 있었지만, 익스플로러의 지원이 종료됨에 따라 이렇게 처리하는것도 쉽지 않은 상태가 되었습니다. Windows 10에는 아직도 익스플로러가 있기 때문에 웹으로 어떤 매크로를 만들고 윈도우를 제어할 수 있습니다. 하지만, 앞으로 나올 Windows 11에서 익스플로러가 삭제되어서 별다른 방법이 없을듯합니다. 엣지에서 옵션을 변경하면 익스플로러처럼 사용이 가능하다고 본거 같긴 하지만... 스트레스 받지 않으려면 포기하세요^^

     

    7. NGM Editor & Player

    엔지엠 에디터는 마우스 액션을 하나 추가한 후 좌표 값을 300, 300으로 설정하면 바로 동작합니다. 사실, 이 글에서는 개발 도구와 환경을 갖추는 내용이 없습니다. 그래서, IDE만 설치하면 무언가 바로 개발해서 사용할 수 있을거라고 생각할수도 있습니다. 하지만, 개발이라는게 단순히 코딩만 한다고해서 어떤 프로그램이 만들어지는건 아닙니다. 배포와 관련된 부분도 고려해야 하고 눈에 보이지 않는 많은 것들이 어렵게 만드는 요인이 될수도 있습니다. 그렇더라도~ 자신에게 맞는 언어를 하나 선택해서 학습하다보면 그동안 불편했던 많은 부분들이 자동화되고 좀 더 가치있는 일에 집중할 수 있도록 도와줄겁니다.

    xBDAZY0.gif

     

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.