본문 바로가기
VB.net

CMD에 원하는명령어를 보내자.

by 호야호잇 2019. 12. 9.

이강좌는 CodeHighligher 와 함께합니다.

 

어... 두가지버전을 준비해봤습니다.

 

첫번쨰 버전은 FindWindow 를 이용한 명령어보내기

두번쨰 버전은 프로세스 이름을 이용한 명령어보내기

 

FindWindow 를 이용한 명령어보내기

 

 

우선 아래의 네임스페이스 코드를 맨위에 적어서 dll을 사용할수있도록 해주세요.

Imports System.Runtime.InteropServices

 

그후 폼코드창 안에

    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

    Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal zero As IntPtr, ByVal lpWindowName As String) As IntPtr

    Const WM_CHAR As Integer = &H102

    Const WM_KEYDOWN As Integer = &H100

    Const VK_RETURN As Integer = &HD

 

를 적어줍니다.

 

윈도우 API들을 설명해드리겠습니다.

 

SendMessage - 프로그램에 지정된 메세지를 보내는 API입니다. 참고 : SendMessage (MSDN)

PostMessage - 메시지를 처리하는 쓰레드를 기다리지 않고 지정된 윈도우 쓰레드와 연관된 메시지 큐에 메시지를 입력합니다. 참고 : PostMessage (MSDN)

FindWindow - 윈도우를 찾습니다. 참고 : FindWindow (MSDN)

 

그리고 버튼클릭에 아래와 같이 적어줍니다.

 

Dim targetwindow As IntPtr = FindWindow(Nothing, "C:\WINDOWS\system32\cmd.exe") '윈도우 타이틀이름을 적어주세요.

If targetwindow = IntPtr.Zero Then 'targetwindow 변수의 IntPtr이 Zero일때

   MsgBox("윈도우를 찾을수 없습니다.")

    Exit Sub

End If

 

If Len(TextBox1.Text) > 0 Then 'TextBox1.Text 의 값이 0보다 클떄

    For i As Integer = 0 To Len(TextBox1.Text) - 1 ' TextBox1.Text 의 문자열 갯수만큼 포문을 돌린다.

        Dim ichar As Char = Convert.ToChar(TextBox1.Text(i)) 'Char로 변환을해주고

        Dim iint As Integer = Convert.ToInt32(ichar) 'Int32로 변환을해준다.

        SendMessage(targetwindow, WM_CHAR, iint, 0) '윈도우에 Int32로 변환된 메세지를 보낸다.

    Next

    PostMessage(targetwindow, WM_KEYDOWN, VK_RETURN, 0) '윈도우에 엔터를 보냅니다.

End If

 

TextBox1.Text 가 들어가는 구간에는 원하는 명령어가 따로 들어가도됩니다.

 

이렇게 1번째 방법이 끝났습니다.

 

 

 

프로세스 이름을 이용한 명령어보내기

 

우선 아래의 네임스페이스 코드를 맨위에 적어서 dll을 사용할수있도록 해주세요.

Imports System.Runtime.InteropServices

 

 

그후 폼코드창 안에

    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

    Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

    Const WM_CHAR As Integer = &H102

    Const WM_KEYDOWN As Integer = &H100

    Const VK_RETURN As Integer = &HD

 

를 적어줍니다.

 

API 설명은 위에서 이미 했습니다.

 

그리고 버튼 클릭에 아래와같이 적어줍니다.

 

Dim targetwindow As IntPtr ' targetwindow의 변수를 만들어준다.

Dim a() As System.Diagnostics.Process = System.Diagnostics.Process.GetProcesses ' a는 프로세스를 가져오는 변수로 만들어준다.

For Each p In a 'a에 p가 있을떄까지 포문을 돌립니다.

    If p.ProcessName = "cmd" Then ' p의 프로세스 이름을 정해줍니다.

        targetwindow = p.MainWindowHandle 'targetwindow 변수는 프로세스의 메인윈도우핸들 값이 되고.

        Exit For '찾았으니 포문을 탈출합니다.

    End If

Next

 

If Len(TextBox2.Text) > 0 Then 'TextBox2.Text 의 값이 0보다 클떄

    For i As Integer = 0 To Len(TextBox2.Text) - 1 ' TextBox2.Text 의 문자열 갯수만큼 포문을 돌린다.

        Dim ichar As Char = Convert.ToChar(TextBox2.Text(i)) 'Char로 변환을해주고

        Dim iint As Integer = Convert.ToInt32(ichar) 'Int32로 변환을해준다.

        SendMessage(targetwindow, WM_CHAR, iint, 0) '윈도우에 Int32로 변환된 메세지를 보낸다.

    Next

    PostMessage(targetwindow, WM_KEYDOWN, VK_RETURN, 0) '윈도우에 엔터를 보냅니다.

End If

 

TextBox2.Text 가 들어가는 구간에는 원하는 명령어가 따로 들어가도됩니다.

 

이렇게 2번째 방법이 끝났습니다.

 

자 실행해보겠습니다.

 

 

 

읽어주셔서 감사합니다.