2015.03.15 02:23


일명 매크로 프로그램을 만드는 방법을 간단히 소개하겠다.

가장 먼저해야 할 일은 제어하고자 하는 프로그램의 핸들을 얻어 오는 것이다.

Spy+프로그램을 이용하면 쉽게 찾을 수 있다.



창 찾기 창이 뜨면 찾기 도구를 드래그 하여 원하는 응용 프로그램에 끌어 놓는다. FindWindow로는 최상위 부모 윈도우만 찾을 수 있다. 제어하고자 하는 응용프로그램에 최상위 윈도우에 끌어다 놓는다.




원하는 프로그램을 선택하면 아래와 같이 윈도우 정보가 표시 된다. 여기서 캡션과 클래스를 통해 원하는 윈도우를 찾을 수 있다.




파일-로그 메세지 메뉴을 이용해 창을 찾은후 확인을 누르면 현재 윈도우가 어떠한 메세지를 받는지 모두 볼 수 있다. 여기서 발생하는 이벤트중 키보드, 또는 마우스 관련 이벤트를 확인 하면 된다.





using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Runtime.InteropServices;


namespace WindowsApplication1
{

    public partial class Form1 : Form
    {
        //사용할 API함수를 임포트 한다.
        [DllImport("USER32.DLL")]
        public static extern uint FindWindow(string lpClassName,
            string lpWindowName);

        [DllImport("user32.dll")]
        public static extern uint FindWindowEx(uint hWnd1, uint hWnd2, string lpsz1, string lpsz2);

        [DllImport("user32.dll")]
        public static extern uint SendMessage(uint hwnd, uint wMsg, uint wParam, uint lParam);

        [DllImport("user32.dll")]
        public static extern uint PostMessage(uint hwnd, uint wMsg, uint wParam, uint lParam);

        uint handle;


        private void button3_Click(object sender, EventArgs e)
        {
           //핸들을 찾는다. Spy+를 통해 찾은 클래스 이름과 캡션을 이용하면 된다. 둘 중 하나만 알경우에도 찾을 수 있다. 그때는 하나의 인자를 null로 넘겨 주면된다.
            handle = FindWindow("SciCalc", "계산기");
          //찾은 핸들에서 자식 윈도우 핸들을 찾기 위해서는 FindWindowEx를 이용한다.
            handle = FindWindowEx(handle, 0, "Shell DocObject View", null);
            handle = FindWindowEx(handle, 0, "Internet Explorer_Server", null);
            label1.Text = handle.ToString();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //찾은 핸들을 통해 메세지를 보낸다. 여기서는 아래 16진수들 의 값은 스파이 메세지 로그에서 찾은 값을 이용하면 된다. 여기서는 키를 누른 메세지(탭키누른후 엔터키를 누른다.)를 보내는 예제 이다.
            PostMessage(handle, 0x0100, 0x9, 0xF0001);
            PostMessage(handle, 0x0101, 0x9, 0xC00F0001);
            PostMessage(handle, 0x0100, 0xD, 0x1C001);
            PostMessage(handle, 0x0102, 0xD, 0xC01C001);
            
        }
}


FindWindow 함수는 윈도우를 찾는 API 함수이다. 첫번째 인자는 실행중인 프로그램의 클래스 이름이고 두번째 인자는 프로그램의 타이틀이다. 최상위 부모 윈도우만 찾을 수 있고 자식 윈도우는 FindWinowEx를 통해 찾으면 된다.

FindWindowEx는 부모윈도우 핸들을 통해 부모 윈도의 자식 핸들을 구하는 함수 이다. 예를 들면 프로그램에 자식으로 붙어 있는 버튼등을 찾으려면 FindWindowEx를 이용하면 된다. 첫번째 인자는 부모 핸들이다. 

두번째 인자는  처번째 인자의 자식핸들 값 또는 0 값이 오면 된다. 만약 핸들 값이 들어오면 들어온 두번째 핸들 값 이후의 자식만 검색한다. 0 이면 모든 윈도우의 자식을 검색한다.

세번째 인자는 클래스 이름, 네번째 인자는 프로그램타이틀명이다.

PostMessage와 SendMessage는 메세지를 보내는 함수이다. 이 함수를 실행함으로서 원하는 제어를 할 수 있다.
첫번째 인자는 메세지를  보내고자하는 윈도우 핸들의 값이고, 두번째 인자는 보내고자 하는 메세지, 세번째 인자는 wParam ,네번째 인자는 lParam이다. lParam ,wParam은 메세지의 부가정보라고 할수 있다.  WM_LBUTTONDOWN메세지가 발생할때는 마우스의 버튼이 눌러진 위치 등의 부가 정보가 필요한데 이러한 정보를 실어보내는 인자이다. 역시 Spy+를 통해 확인이 가능하다.

PostMessage와 SendMessage의 차이점은 거의 없는데 PostMessage로 보내게 되면 메세지를 해당 윈도우에 던지고 바로 리턴하는 함수이고 SendMessage는 메세지를 보낸후 그 메세지가 처리된후 리턴된다. SendMessage동기화가 필요할때 사용하면 되고, 동기화 필요없이 메세지만 보내려면 PostMessage를 이용하면된다.



신고

'Programming > C#' 카테고리의 다른 글

[Win32] 다른 프로그램의 윈도우 제어하기  (0) 2015.03.15


Posted by injunech
2015.03.14 20:54


윈도 파워셸(Windows PowerShell)은 마이크로소프트가 개발한 확장 가능한 명령줄 인터페이스(CLI)  및 스크립트 언어이다. 객체 지향에 근거해 설계되고 있어 닷넷 프레임워크 2.0을 기반으로 하고 있다. 이전에는 마이크로소프트 셸(MSH, 코드네임 Monad)로 불리고 있었다.

현재 윈도 XP도 서버 2003윈도 비스타윈도 서버 2008윈도 7윈도 8윈도 서버 2008 R2를 모두 지원한다.


Windows PowerShell 1.0 PD.png



비슷한 명령어들과 cmdlet 비교[편집]

파워셸에 들어간 cmdlet과 잘 알려진 명령 줄 인터프리터의 비슷한 명령어를 아래의 표로 나열해 놓았다.

윈도 파워셸
(Cmdlet)
윈도 파워셸
(다른 이름)
cmd.exe /COMMAND.COM
(MS-DOS, 윈도, OS/2, 등)
Bash
(유닉스, BSD, 리눅스, 맥 오에스 텐 등)
설명
Get-Locationgl, pwdcdpwd현재 디렉터리/작업 디렉터리를 보여 준다.
Set-Locationsl, cd, chdircdchdircd현재 디렉터리를 바꾼다
Clear-Hostcls, clearclsclear화면을 지운다[1]
Copy-Itemcpi, copy, cpcopycp하나 이상의 파일 / 완전한 디렉터리 트리를 복사한다
Get-Helphelp, manhelpman명령에 대한 도움말을 보여 준다
Remove-Itemri, del, erase, rmdir, rd, rmdelerasermdirrdrm, rmdir파일 / 디렉터리를 지운다
Rename-Itemrni, renrenrenamemv파일 / 디렉터리의 이름을 바꾼다
Move-Itemmi, move, mvmovemv파일 / 디렉터리를 새로운 위치로 옮긴다
Get-ChildItemgci, dir, lsdirls현재 디렉터리의 모든 파일 / 디렉터리를 나열한다
Write-Outputecho, writeechoecho문자열, 변수 등을 표준 출력(stdout)으로 출력한다
Pop-Locationpopdpopdpopd현재 디렉터리를 맨 마지막에 스택으로 푸시(push)한 디렉터리로 바꾼다
Push-Locationpushdpushdpushd현재 디렉터리를 스택으로 푸시(push)한다
Set-Variablesv, setsetset변수 값을 설정하거나 새로 만든다
Get-Contentgc, type, cattypecat파일의 내용을 보여 준다
Select-Stringfindfindstrgrep패턴에 맞추어 줄들을 출력한다
Get-Processgps, pstlist,[2] tasklist[3]ps현재 실행 중인 모든 프로세스를 나열한다
Stop-Processspps, killkill,[2] taskkill[3]kill실행 중인 프로세스를 끝낸다
Tee-Objecttee없음tee입력을 파일이나 변수로 파이프(pipe) 처리한 뒤 파이프라인에 따라 입력을 넘긴다



신고


Posted by injunech
2015.03.14 20:52


Windows PowerShell이라고 Windows 7 이상 사용자, 혹은 Windows XP 사용자도 Visual Studio를 쓰는 유저라면 모두 알고 있는 프로그램일 것입니다.


제가 처음 봤던 Windows PowerShell은 Windows Vista x64에서 봤었던 것이 처음이었습니다. 지금은 Windows Vista 유저가 많이 줄은 편이지만, 제가 베타테스터 이후 RTM이 나왔을 때 MS의 새로운 콘솔을 보여줬던 것이 지금의 PowerShell이었습니다. 하지만 처음 PowerShell을 봤을 때는 그냥 단순한 명령 프롬포트의 업그레이드판인줄 알았지만 그 이후 Windows Server 2008을 설치한 후 PowerShell이 서버 관리에 굉장히 유용한 요소였습니다. ㄱ-;; (어떻게 보면, 아닌 면도 있었지요)


PowerShell은 Python Shell과 유사할 수도 있습니다(?) 왜 그렇게 생각하냐면, 직접 PowerShell에서 명령어 코드를 사용하여 스크립트를 제작할 수 있다는 점이 Python Shell과 유사하다고 생각했기 때문입니다. 


그러나 처음 나왔던 PowerShell에서 정말 불편했던 것은 긴 명령어를 모두 기억해야한다는 단점이었습니다. 리눅스처럼 짧고 간결하면서 사용자가 쉽게 사용할 수 있는 프로그램이었다면, 정말 괜찮았을지도 모릅니다. 하지만 처음에 나왔던 Powershell 1.0은 명령어 보기를 직접 띄워서 일일이 찾아야한다는 단점을 가지고 있었습니다. 그 단점을 보완한 Powershell이 바로 Powershell 3.0과 같이 공개된 PowerShell ISE 프로그램이었습니다.




위에 보시는 것은 평범한 Powershell입니다. 이 커다란 창에서 Tab 키의 자동 완성만을 사용하여 매개변수와 파라미터를 받아내는 명령어를 직접 입력해야하며 설령 스크립트로 만들어 써도 그 기능이 어떠한 역할을 하는지 찾으려면 MSDN 문서를 참고해야 했습니다. 


위 사진은 PowerShell ISE의 화면입니다. 오른쪽에 명령어 도움 상자가 하나 추가되어 자신이 사용하고 싶은 명령어를 직접 색인하거나 사용할 수 있는 파라미터를 확인할 수 있는 데다가 직접 상자에 입력하면 긴 명령어를 PowerShell이 만들어서 명령을 대신해주기도 합니다.


PowerShell을 서버 OS의 입장에서 본다면, 리눅스의 SSH와 언듯 비슷합니다.  PowerShell ISE는 원격으로 서버나 클라이언트 윈도우 OS를 제어할 수 있고, 콘솔 서버 관리를 주로하는 리눅스 서버 유저가 윈도우 서버 유저로 갈아타기도 쉽다고 볼 수 있겠습니다. 다만 PowerShell의 불편한 점은 긴 명령어입니다. 이 긴 명령어를 간략화 하는 것은 MS의 숙제이며 계속 긴 명령어가 유지된다면, 관리나 사용하는 데 오히려 더 장애 요소가 될 수도 있습니다.


현 Windows Server 2012에서는 Powershell로 관리할 수 있는 명령어가 생각보다 많습니다. Windows Azure가 등장하면서 Powershell ISE는 원격으로 클라우드OS를 관리/제어하는데, 용이하지만 일반 윈도우 서버 유저에게 장애 요소가 한 가지 있습니다. 


실제 ISE로 가능한 실행 요소가 GUI에서는 없다는 것입니다. 대표적인 예로, 사용자 정책입니다. MS의 윈도우 서버는 보안상 기본값으로 패스워드를 3개월 이상 유지시킬 수 없도록 설정했습니다. Windows 8과 같은 클라이언트OS에서는 이를 그룹 정책이나 컴퓨터 관리 제어판을 통해서 옵션을 바꿀 수 있지만 윈도우 서버의 경우 Powershell을 사용하지 않으면 옵션을 변경할 수 없다는 단점을 가지고 있습니다. 어떻게 보면, MS가 Powershell의 사용 강제화 하려고하는 조짐도 약간 있는 것 같거나 아니면 정말 보안상 이런 용도로 해야만 했는지 검토해볼 필요가 있는 듯합니다.


결론


Windows PowerShell을 가끔 저도 사용하지만 긴 명령어 때문에 복잡한 것은 여전합니다. 명령어만 간략하다면 정말 유용한 툴이 될 수도 있을 법하고, 프롬포트 대체용으로 대화형 콘솔에 기본값으로 넣어도 될 정도입니다. 하지만 이는 전문가 혹은 개발자 중심으로 얘기하는 것입니다. 일반 사용자에게는 GUI가 더 익숙하고 좋겠지요? Powershell을 이용한 전문적인 사용도 차기 Windows에서 좀 더 개편될 수 있었으면 합니다.

신고


Posted by injunech

티스토리 툴바