2020. 10. 22. 13:04ㆍAutoBot
다운로드
들어가기 전
[UI 참고 영상]
www.youtube.com/watch?v=QTWKUkiEqpQ
저 또한 공부하며 만든 프로젝트입니다.
많이 부족하고 부실한 코드지만 조금이나마 도움이 됐으면 하는 마음에 포스팅합니다!
참고했던 유튜브 영상을 링크로 남깁니다.
최대한 이해하기 쉽게 작성했지만 부족한 점은 댓글로 남겨주세요!
피드백을 받고 수정하겠습니다!
Process?
'프로세스'를 설명하기 위해선 '프로그램'과 차이를 설명하면 조금 쉽게 접근이 가능합니다.
'프로그램'자체는 생명이 없습니다. 프로그램은 보조 기억장치(하드디스크, SSD)에 존재하며
실행되기를 기다리는 명령어(코드)와 정적인 데이터의 묶음입니다.
이 프로그램의 명령어와 정적 데이터가 메모리에 '적재'되면 생명이 있는 '프로세스'가 됩니다.
즉 '프로세스란 실행 중인 프로그램'이죠.
우리는 C#을 이용하여 프로세스를 찾고, 간단한 프로세스 정보를 사용하는 프로젝트를 제작해보겠습니다.
Process - 프로젝트 제작
1. 프로젝트 생성
Windows Forms 앱(. NET Framework) 템플릿으로 프로젝트를 생성합니다.
프로젝트명은 'Process_Test'로 설정하겠습니다.
2. 프로젝트 UI
UI는 따로없습니다.
프로세스를 찾을 타이머
위치, 크기를 조절할 타이머
총 2개의 타이머만 설정해줍니다.
도구 상자(Ctrl + Alt + x)에서 각 도구를 검색 후 드래그 드롭을 하면 설정이 가능합니다.
Timer를 찾아 2개를 추가해 줍니다.
각각의 Timer속성 설정은 다음과 같습니다.
Timer_Size
(Name) : Timer_Size
Timer_Find
(Name) : Timer_Find
3. 코드
Form1.cs
*코드에 대한 궁금한 점은 댓글로 남겨주세요!
코드를 작성 후 F5를 눌러 실행시켜 봅시다.
'메모장'이 열려있지 않으면 출력에 '찾지 못했습니다.'라고 출력됩니다.
이제 아무 메모장이나 열어봅시다.
프로그램이 열린 메모장과 똑같은 크기와 똑같은 위치로 따라가게 됩니다.
출력에는 '메모장'에 대한 위치 값들이 출력됩니다.
메모장의 위치, 크기를 변경하면서 폼의 변화를 살펴보세요.
4. 코드 설명
4-1. 기본 변수
기본 변수 설정입니다.
[DllImport("User32.dll")] 부분은 'Win32 API'를 사용하는 부분입니다.
Win32 Api?
microsoft Windows에서 사용하는 C언어 기반의 API입니다. 기본적으로 C언어 기반이지만,
C++, C# 등 여러 곳에서 사용 가능합니다. 윈도에서 실행되는 모든 종류의 애플리케이션들은
내부적으로 전부 이 윈도 API 함수를 호출하는 형태로 바뀌게 됩니다.
간단하게!
MS에서 프로그래머에게 프로그램을 만들 때 쉽게 가져다 쓰라고 만들어 둔 소스코드!
정도로 생각하면 되겠네요.
GetWindowRect를 호출하여 프로세스의 속성 값을 얻어옵니다.
그리고 그 속성값을 저장할 변수가 'Rect'입니다.
Rect는 '구조체' 타입으로 Struct키워드가 있습니다.
구조체?
형식 참조라고 하는데 값을 넘겨주는 게 아닌 '값이 있는 주소'를 넘겨주는 형태입니다.
여기선 문법을 자세하게 설명할 수 없으니 구글링 해보며 찾으면 도움이 될 거 같네요.
나머지는 프로세스를 찾는데 필요한 변수들입니다.
4-2. Timer_Find_Tick()
프로세스를 찾는 타이머 동작 코드입니다.
Process.GetProcessesByName은 프로세스의 이름을 찾아서 불러오는 기능을 합니다.
여기서 프로세스의 이름을 찾는 방법은
Ctrl + Alt + Delete > 작업 관리자를 열어줍니다.
열려있는 메모장을 찾은 뒤
마우스 오른쪽 클릭 > 속성을 열어줍니다.
그럼 실행 중인 프로세스의 이름이 나오게 됩니다.
여러분은 다른 프로세스 이름을 찾은 뒤 실행 보는 것도 도움이 돼겠네요.
그런 뒤 프로세스를 찾았다면 배열의 길이가 '1'이상일 테니 예외 처리를 해주고
찾았다면 프로세스를 저장하고 Timer_Size.Start()로 폼 사이즈 타이머를 실행시켜 줍니다.
4-3. Timer_Size_Tick()
GetWindowRect로 찾은 프로세스의 속성 정보를 얻습니다.
각 정보를 출력한 후 사이즈를 변경해줍니다.
여기서 Left, Right, Top, Bottom의 수치는 다음과 같습니다.
즉,
Bottom - Top = 높이
Rigth - Left = 너비
라는 공식이 나오죠. 어디에 위치했는지, 프로세스의 크기는 어떤지를 구할 수 있게 됩니다.
위 코드는 이렇게 프로세스 속성을 이용하여 폼의 크기, 위치를 조절합니다.
4-4. Process_Exited()
프로세스가 종료됐을 때 실행될 코드입니다.
실제로 프로그램 실행 중 메모장이 꺼지면 다시 프로세스를 추적하는 타이머가 실행되어
다시 추적하기 시작하죠.
조금 특이한 점은 Invoke를 사용하여 실행하는데 이는 위 주석 처리된 코드로 바꿔 실행해보면
어떤 점이 다른지 알 수 있습니다.
이렇게 Invoke를 사용하지 않고 실행했을 때 메모장을 끄게 되면
타이머가 실행되지 않습니다.
왜 그런 걸 까요?
(죄송합니다.. 정확하지 않은 정보입니다. ㅜ 많이 검색을 해봤는데 확실한 답을 못 찾았네요.)
(제가 생각하는 이유입니다.)
크로스 스레드?
프로그램이 동작하는데 필요한 공간을 설정하는데 이를 '스레드'라고 합니다.
이 스레드는 여러 개가 존재할 수 있으며 우리가 여러 프로세스를 동시에 실행할 수 있죠.
음악 플레이어를 들으며 비주얼 스튜디오로 코딩을 동시에 할 수 있는 게 이 스레드의 존재입니다.
이처럼 비주얼 스튜디오 또한 여러 개의 스레드로 동작하는데
UI를 담당하는 스레드, 프로그램이 동작하는 스레드, 타이머를 작동하는 스레드 등
사용자가 스레드를 만들 수도 있고 기본적으로 설정돼 있기도 하죠.
우리가 실행할 종료 메서드(Process_Exited)는 '메모장' 스레드에서 '종료했어!'라는 신호를 주면 실행하게 됩니다.
하지만 '메모장' 스레드는 '비주얼 스튜디오' 스레드와는 다른 곳이므로 크로스 스레드가 발생합니다.
자신의 스레드가 아닌 다른 스레드가 그 컨트롤에 접근했을 때 발생하죠.
이를 해결하기 위해 Invoke() 메서드를 통해 '비주얼 스튜디오' 스레드에게 "시간이 좀 날 때 이 일 좀 처리해줘"라고 메시지를 보내는 것이죠. 즉 '메모장 스레드'의 이벤트가 '비주얼 스튜디오 스레드'에서 실행되게 됩니다.
Process 프로젝트는 여기서 끝입니다.
UI - Font Awesome
UI를 꾸미는 것은 많은 시간이 필요합니다.
필요한 이미지를 찾고, 적용시키고 크기가 맞지 않으면 다시 조절해야 하는 등 여러 불편함이 있습니다.
이런 불편함을 좀 더 편리하게 이용할 수 있는 게 Font Awesome과 같은 공개 소스 사이트입니다.
이 사이트는 Icon이미지에 많은 소스를 제공합니다. 또 이를 이용한 패키지 또한 만들어져 있어 편리하게
프로젝트에 적용시킬 수 있죠.
UI 프로젝트는 이 Font Awesome 패키지를 이용한 UI를 꾸며보고 각 버튼의 알람 이벤트를 구현하겠습니다.
UI - 프로젝트 제작
1. 프로젝트 생성
Windows Forms 앱(. NET Framework) 템플릿으로 생성합니다.
프로젝트 명은 'EventForm'으로 설정하겠습니다.
2. 프로젝트 패키지 추가
도구 > NuGet 패키지 관리자 > 설루션용 NuGet 패키지 관리
FontAwesome.Sharp 설치
정상적으로 설치가 되면 패키지가 추가된 것을 확인할 수 있습니다.
3. UI
3-1. Form1
메인 폼 UI입니다. 각 타입에 대한 이벤트를 출력합니다.
모두 Button으로 구성돼 있습니다.
각 Button의 속성은 다음과 같습니다.
성공 타입 버튼
-(Name) : Btn_Success
- Text : 성공 타입
실패 타입 버튼
-(Name) : Btn_Warning
- Text : 실패 타입
에러 타입 버튼
-(Name) : Btn_Error
- Text : 에러 타입
인포 타입 버튼
-(Name) : Btn_Info
- Text : 인포 타입
* timer 추가
3-2. EventForm
이벤트를 보여줄 UI입니다.
iconPictureBox와 Label로 구성돼 있습니다.
iconPictureBox경우 FontAwesome 패키지를 추가하면 사용이 가능합니다.
각 속성 설정은 다음과 같습니다.
메인 폼 (EventForm)
FormBorderStyle : None
투명한 박스
(Name) : IconMessage
IconChar : None
IconColor : White
Size : 54,54
BackColor : Transparent
label1
(Name) : LabelMessageText
Font : 굴림, 30pt
X표 아이콘
(Name) : BtnExit
IconChar : TimesCircle
IconColor : White
Size : 54,54
BackColor : Transparent
4. 코딩
Form1.cs
EventForm.cs
*코드에 궁금한 점은 댓글로 달아주세요!
코드를 작성하면 F5를 눌러 실행시켜 봅시다.
각 버튼에 따라서 모니터의 오른쪽 하단에 이벤트가 표시됩니다.
5. 코드 설명
5-1. ShowAlert()
frm에는 현재 열려있는 폼 있는지 확인하고 없다면 생성하게 됩니다.
생성 위치는 전에 생성했던 위치보다 높게 생성되고, PrimaryScreen.WorkingArea를 이용하여
사용자의 모니터 크기를 파악하여 설정합니다.
생성할 때 넘겨준 파라미터(type)로 각 타입에 대한 설정을 합니다.
생성할 때 넘겨준 파라미터(msg)로 텍스트를 설정 후
타이머를 실행시킵니다.
5-2 timer1_Tick()
enum값을 변경하여 각 액션에 맞는 동작을 합니다.
EventForm 프로젝트는 여기서 끝입니다.
끝으로
추가적인 IconButton, IconPictrueBox의 쉬운 아이콘 설정 방법을 알려드리며 마치겠습니다.
EventForm > EventForm.Designer.cs에 들어가 보면 각 도구(UI)의 설정이 적혀있습니다.
여기서 FontAwesome.Sharp.IconChar. ~~ 부분을 수정하면 간단하게 수정이 가능합니다.
이제 마지막 포스팅만 남았네요!
중간에 목차를 바꾸느라.. 조금 늦었습니다.
크롤링하는 법을 알려드리는 게 좀 더 도움이 될 같다고 생각했거든요.
내일 까진 포스팅을 완료해봅시다!