티스토리 뷰

#include <stdio.h>
#include <Windows.h>

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
unsigned int GetListBoxCount(HWND hListbox);

void KillProcess(char *a_sName);

HINSTANCE g_hInst;

int CALLBACK WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

	// 윈도우를 등록
	WNDCLASSA WndClass = { 0 };

	WndClass.lpszClassName = "suspect"; // CreateWindowA의 첫 번째 인자에서 정해준 이름과 같아야함.
	WndClass.hInstance = hinstance;
	WndClass.lpfnWndProc = WndProc; // 응용 프로그램 메시지 큐에서 꺼내서 처리하는 과정을 프로그래머가 직접 만들어줘야 하는데 바로 이러한 기능을 하는 함수이다.
	WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

	
	RegisterClassA(&WndClass);


	// 윈도우를 생성
	CreateWindowA( //다른 프로세스를 부모윈도우로 하고 그 안에 자식으로 들어가려면 WS_CHILD를 넣어주어야 함.
		"suspect", // button과 edit 같이 정해준 형식 말고 프로그래머가 임의로 원하는 윈도우 모양을 만들려면 임의 값을 지정하고 RegisterClass 함수를 사용한다.
		"BirthDayDay",
		//WS_POPUP | WS_VISIBLE,
		WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_BORDER, 
		// WS_OVERLAPPEDWINDOW => 최대, 최소화, 시스템 메뉴를 가질 수 있는 형태. 
		0, // x좌표
		0, // y좌표
		1000, // 넓이
		1000, // 높이
		NULL, // 부모 윈도우 핸들
		NULL, // 메뉴
		hinstance, // 인스턴스
		NULL
		);

	MSG msg;

	while (GetMessageA(&msg,0,NULL,NULL)) // 메시지를 반복적으로 꺼낸다. 이 함수를 써야 메시지큐에서 메시지를 꺼낼 수가 있다.
	{
		DispatchMessageA(&msg); // 메시지가 올 때마다 꺼내서 아래 메시지 처리 함수가 호출될 수 있도록 Dispatch 해준다.
	}
	
	return 0;

}

#define BUTTON_ADD		100
#define BUTTON_CHECK	200
#define EDIT_INPUT		300
#define LIST			400

HWND hEdit;
HWND hListBox;

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) // 실제로 메시지를 처리
{
	static char sBuf[1024] = { 0 };
	static unsigned int nCount = 0;
	// 메시지가 발생할 때마다 이 함수가 호출
	switch (uMsg) 
	{

	case WM_CREATE:
		CreateWindowA("button", "Add", WS_CHILD | WS_VISIBLE, 0, 0, 100, 100, hwnd, (HMENU)BUTTON_ADD, g_hInst, NULL); // hInstance에는 프로그램이 메모리에 로드가 되면 시작 주소를 넣어주야 함
		CreateWindowA("button", "Check", WS_CHILD | WS_VISIBLE, 0, 100, 100, 100, hwnd, (HMENU)BUTTON_CHECK, g_hInst, NULL); // 자식 윈도우를 만들 때 hMenu는 고유한 id가 된다. 
		hEdit = CreateWindowA("edit", "", WS_CHILD | WS_VISIBLE | WS_BORDER, 0, 200, 300, 30, hwnd, (HMENU)EDIT_INPUT, g_hInst, NULL);
		hListBox = CreateWindowA("listbox", "", WS_CHILD | WS_VISIBLE | WS_BORDER, 0, 300, 300, 300, hwnd, (HMENU)LIST, g_hInst, NULL);
		return 0;

	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case BUTTON_ADD: 
			GetWindowTextA(hEdit, sBuf, 1024); // sBuf에 edit창에 있는 글자를 가져옴.
			SendMessageA(hListBox, LB_ADDSTRING, NULL, (LPARAM)sBuf); // hListBox에 LB_ADDSTRING으로 sBuf를 추가시킴.
			break;
		case BUTTON_CHECK:
			nCount = GetListBoxCount(hListBox);
			for (int i = 0; i < nCount; i++)
				SendMessageA(hListBox, LB_GETTEXT, i, (WPARAM)sBuf);
				KillProcess(sBuf);
			
				//MessageBoxA(0, sBuf, sBuf, 0);
			break;
		}
		return 0;

	case WM_DESTROY: // 닫기 버튼을 눌렀을 때
		PostQuitMessage(0);
		return 0;

	}

	return DefWindowProcA(hwnd, uMsg, wParam, lParam); //기본적인 메시지(최대, 최소화 등)를 윈도우가 모두 해주는 함수

} 

unsigned int GetListBoxCount(HWND hListbox)
{
	unsigned int nCount = 0;
	nCount = SendMessageA(hListBox, LB_GETCOUNT, 0, 0);
	return nCount;
}

void KillProcess(char *a_sName)
{
	HANDLE hProcess;
	DWORD dwPid = 0;
	HWND hWnd;

	hWnd = FindWindowA(NULL, a_sName); // 해당 프로그램 이름의 핸들을 가져옴.
	GetWindowThreadProcessId(hWnd, &dwPid); // hWnd = PID를 얻고자하는 윈도우의 핸들
											// dwPid = 반환받을 PID의 포인터
	hProcess = OpenProcess(PROCESS_TERMINATE, false, dwPid); // 프로세스의 핸들 값을 리턴.
	TerminateProcess(hProcess, 0); // 해당 프로세스를 죽임.

}

'프로그래밍 > Windows OS, API ' 카테고리의 다른 글

간단한 윈도우 창 만들기  (0) 2016.10.19
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함