NGMsoftware

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

    학습


    기타 4부 - 언어별 메모장에 텍스트 입력하기. (Enter text in language-specific notepad.)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 이전 시간에 언어별로 그림판에 마우스 클릭을 알아봤는데요. 오늘은~ 메모장에 텍스트 입력을 어떻게 하는지 알아볼께요. 마우스 클릭을 먼저 알아본 이유는 간단합니다. 텍스트를 입력하려면~ 텍스트를 입력 받는 프로그램이 활성 상태에 있어야 합니다. 여러분들도 메모장과 엑셀을 실행시켜놓고 메모장에 텍스트를 입력하려면 메모장을 클릭하고, 엑셀에 텍스트를 입력하려면 엑셀을 클릭해서 활성 상태로 만들죠? 매크로와 같은 소프트웨어도 입력할 프로그램을 클릭해서 활성 상태로 만들어야 하기 때문입니다.

     

    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));
    }
    
    void TextWrite()
    {
        char str[12] = { 'N','G','M','S','O','F','T','W','A','R','E','\0' };
    
        for (int i = 0; i < strlen(str); i++)
        {
            if (str[i] != NULL)
            {
                INPUT input;
                WORD vkey = str[i];
                input.type = INPUT_KEYBOARD;
                input.ki.wScan = MapVirtualKey(vkey, MAPVK_VK_TO_VSC);
                input.ki.time = 0;
                input.ki.dwExtraInfo = 0;
                input.ki.wVk = vkey;
                input.ki.dwFlags = 0;
                SendInput(1, &input, sizeof(INPUT));
    
                input.ki.dwFlags = KEYEVENTF_KEYUP;
                SendInput(1, &input, sizeof(INPUT));
            }
        }
    }
    
    int CALLBACK WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
    {
        MouseMove();
        MouseLeftClick();
    
        TextWrite();
    }

    RG9LrDA.gif

     

     

    2. C++ for Visual Studio 2019

    // ConsoleApplication1.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
    //
    
    #include <iostream>
    #include <Windows.h>
    #include <string>
    
    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));
    }
    
    void TextWrite()
    {
        std::string str = "NGMSOFTWARE";
    
        for (int i = 0; i < str.length(); i++)
        {
            INPUT input;
            WORD vkey = str[i];
            input.type = INPUT_KEYBOARD;
            input.ki.wScan = MapVirtualKey(vkey, MAPVK_VK_TO_VSC);
            input.ki.time = 0;
            input.ki.dwExtraInfo = 0;
            input.ki.wVk = vkey;
            input.ki.dwFlags = 0;
            SendInput(1, &input, sizeof(INPUT));
    
            input.ki.dwFlags = KEYEVENTF_KEYUP;
            SendInput(1, &input, sizeof(INPUT));
        }
    }
    
    int CALLBACK WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
    {
        MouseMove();
        MouseLeftClick();
    
        TextWrite();
    }
    
    // 프로그램 실행: <Ctrl+F5> 또는 [디버그] > [디버깅하지 않고 시작] 메뉴
    // 프로그램 디버그: <F5> 키 또는 [디버그] > [디버깅 시작] 메뉴
    
    // 시작을 위한 팁: 
    //   1. [솔루션 탐색기] 창을 사용하여 파일을 추가/관리합니다.
    //   2. [팀 탐색기] 창을 사용하여 소스 제어에 연결합니다.
    //   3. [출력] 창을 사용하여 빌드 출력 및 기타 메시지를 확인합니다.
    //   4. [오류 목록] 창을 사용하여 오류를 봅니다.
    //   5. [프로젝트] > [새 항목 추가]로 이동하여 새 코드 파일을 만들거나, [프로젝트] > [기존 항목 추가]로 이동하여 기존 코드 파일을 프로젝트에 추가합니다.
    //   6. 나중에 이 프로젝트를 다시 열려면 [파일] > [열기] > [프로젝트]로 이동하고 .sln 파일을 선택합니다.
    

    692XZdm.gif

     

     

    3. C# for Visual Studio 2019

    C#은 다른 언어들에 비해 뭔가 상당히 복잡해 보이는 느낌을 받을 수 있습니다. C#은 특별히 다른 라이브러리를 이용하거나 패키지를 설치하지 않고, 직접 SendInput을 구현했기 때문입니다. C#도 유용한 라이브러리들이 많이 있으니, 간단하게 참조 추가해서 사용할 수 있습니다. 이외에도 엔지엠소프트웨어의 엔터프라이즈 버전을 구매하시면 잘 만들어진 엔지엠 프레임워크를 사용하여 쉽고 간단하게 매크로 제작이 가능합니다.

    using System;
    using System.Runtime.InteropServices;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                MouseLeftClick();
                TextWrite();
            }
    
            static void TextWrite()
            {
                foreach (char c in "NGMSOFTWARE")
                {
                    INPUT[] inputs = new INPUT[1];
    
                    inputs[0] = new INPUT();
                    inputs[0].type = INPUT_KEYBOARD;
                    inputs[0].u.ki.wVk = c;
                    inputs[0].u.ki.time = 0;
                    inputs[0].u.ki.wScan = c;
                    inputs[0].u.ki.dwExtraInfo = IntPtr.Zero;
                    SendInput(1, inputs, Marshal.SizeOf(inputs[0]));
    
                    inputs = new INPUT[1];
                    inputs[0].type = INPUT_KEYBOARD;
                    inputs[0].u.ki.dwFlags = KEYEVENTF_KEYUP;
                    SendInput(1, inputs, Marshal.SizeOf(inputs[0]));
                }
            }
    
            static void MouseLeftClick()
            {
                INPUT[] inputs = new INPUT[2];
    
                inputs[0] = new INPUT();
                inputs[0].type = INPUT_MOUSE;
                inputs[0].u.mi.dx = (300 * 65535) / System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;
                inputs[0].u.mi.dy = (300 * 65535) / System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;
                inputs[0].u.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
    
                inputs[1] = new INPUT();
                inputs[1].type = INPUT_MOUSE;
                inputs[1].u.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
    
                SendInput(2, inputs, Marshal.SizeOf(inputs[0]));
    
                inputs = new INPUT[1];
    
                inputs[0] = new INPUT();
                inputs[0].type = INPUT_MOUSE;
                inputs[0].u.mi.dwFlags = MOUSEEVENTF_LEFTUP;
    
                SendInput(2, inputs, Marshal.SizeOf(inputs[0]));
            }
    
            const int INPUT_MOUSE = 0;
            const int INPUT_KEYBOARD = 1;
            const uint KEYEVENTF_KEYUP = 0x0002;
            const uint MOUSEEVENTF_MOVE = 0x0001;
            const uint MOUSEEVENTF_LEFTDOWN = 0x0002;
            const uint MOUSEEVENTF_LEFTUP = 0x0004;
            const uint MOUSEEVENTF_ABSOLUTE = 0x8000;
    
            struct INPUT
            {
                public int type;
                public InputUnion u;
            }
    
            [StructLayout(LayoutKind.Explicit)]
            struct InputUnion
            {
                [FieldOffset(0)]
                public MOUSEINPUT mi;
                [FieldOffset(0)]
                public KEYBDINPUT ki;
            }
    
            [StructLayout(LayoutKind.Sequential)]
            struct MOUSEINPUT
            {
                public int dx;
                public int dy;
                public uint mouseData;
                public uint dwFlags;
                public uint time;
                public IntPtr dwExtraInfo;
            }
    
            [StructLayout(LayoutKind.Sequential)]
            struct KEYBDINPUT
            {
                public ushort wVk;
                public ushort wScan;
                public uint dwFlags;
                public uint time;
                public IntPtr dwExtraInfo;
            }
    
            [DllImport("user32.dll", SetLastError = true)]
            static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
        }
    }

    DZkdkDQ.gif

     

     

    4. Java for Eclipse Enterprise

    import java.awt.AWTException;
    import java.awt.Robot;
    import java.awt.event.InputEvent;
    
    public class main {
        public static void main(String[] args) {
            try {
                mouseLeftClick();
                textWrite();
            } 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);
            }
        
        public static void textWrite() throws AWTException {
            Robot bot = new Robot();
            
            String ngm = "NGMSOFTWARE";
            
            for (char c : ngm.toCharArray()) {
                bot.keyPress(c);
                bot.keyRelease(c);
            }
        }
    }

    j4cRy1G.gif

     

     

    5. Python for Visual Studio Code

    import pyautogui
    import time
    
    def mouseLeftClick():
        pyautogui.moveTo(300, 300)
        pyautogui.click()
    
    def textWrite():
        pyautogui.write("NGMsoftware")
    
    mouseLeftClick()
    
    time.sleep(0.1)
    
    textWrite()

    sEn9JPI.gif

     

     

    6. JavaScript for Visual Studio Code

    [ 이전 글 ]의 마우스와 동일하게 웹브라우저라는 플랫폼에 종속적인 자바스크립트는 윈도우를 제어할 수 없습니다.

     

    7. NGM Editor & Player

    외부 라이브러리나 패키지를 이용하면 좀 더 자연스러운 구현이 가능해집니다. C부터 NGM까지 텍스트 쓰기 동영상을 보면 대소문자 구분이 어떻게 되는지 확인할 수 있습니다. 자동으로 대소문자를 구분해서 입력하고, 한글과 영어를 스마트하게 인식해서 IME를 바꾸려면 추가적인 코딩이 필요합니다. 엔지엠 에디터는 스마트 모드를 클릭 한번으로 사용이 가능합니다. 대소문자와 한영 변환을 쉽게하려면 엔지엠 에디터를 이용해보세요.

    Nxpz1RM.gif

     

     

    개발자에게 후원하기

    MGtdv7r.png

     

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

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

    감사합니다~

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

    댓글목록

    등록된 댓글이 없습니다.