본문 바로가기
하드웨어/아두이노

[아두이노] 아두이노 레오나르도 윈도우 제어 with NirCmd

by 만들오 2022. 4. 20.
728x90

아두이노 레오나르도의 키보드 기능을 이용해 NirCmd를 사용하는 사례입니다.

 

NirCmd는 윈도우 커맨드라인 툴로서, 커맨드라인을 통해 윈도우를 제어할 수 있습니다.

 

 

[윈도우] NirCmd - 윈도우 커맨드라인 제어모듈

NirCmd란? 윈도우의 커맨드라인(cmd 또는 PowerShell)에서 윈도우를 제어할 수 있도록 도움을 주는 라이브러리 입니다. 커맨드라인으로 윈도우 제어하는 방법을 찾다가 아래의 블로그에서 정보를 얻

mandloh.tistory.com

 

 

win + r 키를 눌러보면 실행 창이 나오는데, 이를 이용해 커맨드라인에 진입하지 않고서도 NirCmd를 활용할 수 있습니다.

 

즉, win + r 입력 후, 원하는 문구를 쓰고 엔터를 치면 원하는대로 작동이 됩니다.

 

아두이노 레오나르도가 받은 시리얼 입력으로 적용해보면 다음 코드와 같습니다.

(문제점이 있습니다. 뒤에 설명!!)

#include "Keyboard.h"

void setup() {
  Serial.setTimeout(100);
  Serial.begin(9600);
  Keyboard.begin();
}

void loop() {
  if (Serial.available() > 0) {
    String msg = Serial.readString();
    Serial.println(msg);
    //입력 예 : exec,nircmd
    if (msg.indexOf("exec") >= 0) {
      int idx = msg.indexOf(",");
      String cmd = msg.substring(idx + 1, msg.length());
      Keyboard.press(KEY_LEFT_GUI); // win 키
      Keyboard.press('r');
      Keyboard.releaseAll();
      delay(100); //딜레이가 짧은경우, 입력이 씹힐 수 있음      
      Keyboard.print(cmd);
    }
  }
}

시리얼 입력으로 exec,nircmd 를 입력하면 잘 작동했습니다.

하지만 한글이 입력되지 않는 치명적인 문제가 있습니다...

 

특정 창을 활성화 시키려면 한글이 필수이므로 다른 방법을 찾아야 합니다.

찾은 방법은, ctrl + v 단축키 입력입니다.

#include "Keyboard.h"

void setup() {
  Serial.setTimeout(100);
  Serial.begin(9600);
  Keyboard.begin();
}

void loop() {
  if (Serial.available() > 0) {
    String msg = Serial.readString();
    Serial.println(msg);
    if (msg.indexOf("exec") >= 0) {
      Keyboard.press(KEY_LEFT_GUI); //win 키
      Keyboard.press('r');
      Keyboard.releaseAll();
      delay(100); //딜레이가 짧은경우, 입력이 씹힐 수 있음
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press('v');
      Keyboard.releaseAll();
      Keyboard.write(KEY_RETURN);
    }
  }
}

다행히 이 방법은 잘 작동 합니다.

 

복사할 문구는 clipboard 기능으로 다양한 언어와 환경에서 제어가 가능합니다.

 

잘만 하면, 브라우저 + 아두이노만으로 윈도우 제어가 가능할 것 같습니다.

[끝].

댓글