본문 바로가기

프로그래밍/Windows20

C++ 17에서 폴더/파일 구분하기 경로를 입력받아 폴더인지 파일인지 확인하기 C++ 17로 윈도우에서 프로그램을 만들면서 폴더와 파일을 구분해야하는 경우가 생겨 아래 코드를 찾게되었다. 찾은 코드는 테스트 시 작동에는 문제가 없었지만 문자열을 LPCWSTR (WCHAR *)로 받아야 한다는 사소한 단점이 있었다. 혹시 String 클래스를 사용해 입력받은 경로가 폴더인지 파일인지 구분할 수 있는 방법이 있는지도 찾아봤지만, 검색을 해봐도 찾지 못했다.. int isFolder(LPCWSTR path) { /* args: LPCWSTR fileName : 파일의 full path return: int code : 폴더는 1, 파일은 0, 에러는 -1 summary: 폴더인지 파일인지 구분 */ WIN32_FIND_DATA wInfo; HA.. 2023. 5. 19.
[Windows Programming] 모니터 제어 명령 세트(MCCS)를 활용한 모니터 제어 프로그램 프로그램 제작 이유 만약 PC와 모니터가 2대씩 있을 때 각 PC를 둘 다 듀얼 모니터로 사용하고 싶다면 어떻게 하는게 좋을까? 가장 쉽게 문제를 해결하려면 매번 사용하는 PC의 HDMI 케이블을 바꿔서 연결하면 된다! 만약 그것도 귀찮다면 KVM 스위치를 구매해 연결해두고 필요한 PC의 버튼이나 단축키를 눌러서 사용하면 된다. (망 분리 환경이라면 보통 Aten과 같은 회사의 보안 인증이 된 제품을 지급해준다. 하지만 개인이 구매하기 어렵고 비싸다..!) 하지만 PC를 사용하다보면 양쪽 PC를 동시에 활용해야하는 경우가 꽤 많았고 개인적으로 KVM에서 듀얼 모니터 설정이 더 어려웠던 것 같다. 차라리 아래처럼 케이블을 전부 연결해두고 모니터 버튼으로 필요할 때마다 입력소스를 바꿔주는게 더 편하다. 많이.. 2022. 8. 7.
[Win32 API] GetCurrentDirectory : 현재 디렉토리 위치 구하기 MSDN https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getcurrentdirectory GetCurrentDirectory function (winbase.h) - Win32 apps Retrieves the current directory for the current process. docs.microsoft.com Header #include Syntax DWORD GetCurrentDirectory( [in] DWORD nBufferLength, [out] LPTSTR lpBuffer ); Parameters - [in] DWORD nBufferLength : NULL을 포함한 문자열 변수의 길이 - [out] LPT.. 2022. 6. 1.
[Win32 API] PathFileExists : 파일 존재 여부 확인하기 MSDN https://docs.microsoft.com/en-us/windows/win32/api/shlwapi/nf-shlwapi-pathfileexistsa PathFileExistsA function (shlwapi.h) - Win32 apps Determines whether a path to a file system object such as a file or folder is valid. docs.microsoft.com Header #include #pragma comment(lib, "Shlwapi.lib") Syntax BOOL PathFileExistsA( [in] LPCSTR pszPath ); Parameters - 파일의 절대 경로를 LPCTSTR 타입으로 넣어줌. ( ex) L.. 2022. 6. 1.
[Windows] CallBack 함수 CallBack 함수 함수는 일반적으로 프로그래머에 의해 작성되고 호출된다. CallBack 함수는 일반적인 함수와 비슷하지만, 호출되는 시점이 시스템(이벤트)에 의해 결정된다는 차이가 있다. 윈도우 API를 공부하면 가장 처음 배우는 Window를 띄우는 코드(링크)에서도 콜백 함수인 윈도우 프로시져를 볼 수 있는데, 해당 콜백함수(프로시져)는 WinMain에서 WndClass.lpfnWndProc=WndProc; 로 WNDCLASS 구조체에 등록된 뒤에 RegisterClass(&WndClass); 되어진 이후 따로 호출하지 않는다. 하지만 구조체의 정보가 등록된 이후는 WinMain 내부의 메시지 루프인 while(GetMessage(&Message, NULL, 0, 0)) { TranslateMe.. 2022. 5. 7.
[WPF] YouTube Player 1. UI/ XML 2. C# using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes;.. 2022. 3. 10.
[WPF] OpenCvSharp4로 윈도우 안에 카메라 영상 그리기 1. 목적 WPF에서 OpenCV를 활용하여 기본 WPF 컨트롤인 Image에 노트북 (또는 USB) 카메라에서 가져온 영상을 Bitmap 형식으로 그려줌 환경 구축 및 빌드는 https://hwan001.tistory.com/144?category=836235 링크 참조 2. 코드 (Xaml) 3. 코드 (C#) using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Docu.. 2022. 2. 2.
[WPF] OpenCVSharp 4 Nuget 설치 1. 설치 목적 WPF에서 OpenCV 최신 버전(2022년 2월 2일 기준) 기능 사용 2. 주의점 OpenCVSharp4는 여러개의 Nuget으로 나워져 있음 한 개라도 없으면 함수 또는 자료형의 일부를 찾을 수 없음 3. 설치 (Nuget Package Manager) - WPF 환경에서 사용하기 위해 초록색 박스 부분 (OpenCvSharp4, OpenCvSharp4.runtime.win, OpenCvSharp4.WpfExtentions) 설치 - 윈도우 환경이라면 빨간색 박스 부분 설치가 더 간편함 (OpenVcSharp4.Windows) 4. OpenVcSharp4.Windows (빨간 박스) 설치 완료 2022. 2. 2.
[WPF] Visual Studio 2022 개발 환경 구축 및 프로젝트 빌드 1. Visual Studio 2022 Community 설치 2. 새 프로젝트 만들기 > WPF 앱 (.NET Framework) 선택 3. XAML/ 디자인 편집기와 C# 편집기 4. 빌드 및 실행 2020. 3. 15.
[Windows] 윈도우 로그인 배경화면 변경 [기본 지식] - 로그인 배경화면 변경 방법 - 관리자 권한 요구 - 파일열기 대화상자 - 레지스트리 변경 방법 [Example Source] #include #include #include "ShReg.h" // Windows API정복 책 참조 #define KEY L"SOFTWARE\\Microsoft\\windows\\CurrentVersion\\Authentication\\LogonUI\\Background" #define PATH L"C:\\windows\\system32\\oobe\\info\\backgrounds\\backgroundDefault.jpg" #define DIRPATH L"C:\\windows\\system32\\oobe\\info\\backgrounds" LRESULT CA.. 2016. 9. 17.
[Windows] 환경 변수 얻어오기 (Win32API) 1. 개요 ExpandEnvironmentStrings(LPCTSTR lpSrc, LPTSTR lpDst, DWORD nSize) - 환경 변수에 저장된 데이터를 불러올 수 있음. Parameter - lpSrc : 아래 표의 왼쪽 값을 문자열로 넣어줌. - lpDst : 아래 표 오른쪽 결과를 얻어옴. - nSize : lpDst 의 크기 2. 코드 #include #include #define SYSTEMDRIVE "%SystemDrive%" #define PUBLIC "%PUBLIC%" #define USERDOMAIN "%USERDOMAIN%" #define USERNAME "%USERNAME%" #define OS "%OS%" #define COMPUTERNAME "%COMPUTERNAME%" .. 2016. 9. 4.
[Windows] hosts 파일 바꾸기 (Win32API) 1. 개요 - hosts 파일 수정으로 특정 URL을 웹 브라우저에 입력 시 원하는 서버로 연결 가능. ex) www.daum.net 입력 -> 결과는 www.google.com 로 이동 - hosts 파일 경로 : C:\Windows\System32\drivers\etc\hosts - 리소스 드랍 활용 - 관리자 권한 필요 - hosts 파일 변경은 백신에서 탐지됨 2. 설정 3. 코드 #include #include "resource.h" // 수정된 hosts 파일을 리소스로 등록 : IDR_FILE1 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HINSTANCE g_Inst; LPCWSTR lpszClass = TEXT("WINDOW"); // .. 2016. 8. 10.
[Windows] 리소스 드랍 (Win32API) 1. 코드 //리소스 변수 선언 HMODULE hDll; HRSRC hResource; HGLOBAL hData; DWORD filesize, numWritten; LPVOID pResource; HANDLE hFile; TCHAR Adr[] = L"C:\\File.exe"; // 파일 경로 // 아래는 코드 적용 부분, 필요한 부분에 적절히 사용 // 리소스 찾기, 에러 시 NULL hResource = FindResource(g_Inst, MAKEINTRESOURCE(IDR_EXE1), L"exe"); // 리소스 로드, 에러 시 NULL hData = LoadResource(g_Inst, hResource); // 락, 에러 시 NULL pResource = LockResource(hData); /.. 2015. 8. 31.
[Windows] 윈도우 버전 확인 (Win32API) 1. 개요 - OSVERSIONINFOEX 구조체로 윈도우의 버전을 알수있음. 2. 코드 OSVERSIONINFOEX osvi; ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); // OSVERSIONINFOEX 구조체를 이용하여 버전 구분 switch(osvi.dwPlatformId){ // NT 기반 운영체제 case VER_PLATFORM_WIN32_NT: /* dwMajorVersion, dwMinorVersion 멤버로 운영체제 구분 ex) if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0) version = "vista"; .. 2015. 8. 23.
[Windows] 프로세스/운영체제 비트 확인 (Win32API) 1. 코드 // 현재 프로세스 비트 구분 #if defined(_WIN64) return TRUE; #else return FALSE; #endif // 운영체제 = 64bit, 프로세스 = 32bit 일 경우 TRUE BOOL IsCurrentProcessWow64() { BOOL bIsWow64 = FALSE; typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS)(HANDLE, PBOOL); LPFN_ISWOW64PROCESS fnIsWow64Process; fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle(TEXT("kernel32")), "IsWow64Process"); if (!fnIsWow64P.. 2015. 8. 23.
[Windows] 프로세스 정보 확인하기 (Win32API) 1. 설명 - 현재 프로세스 정보 DWORD pid; HANDLE hdl; pid = GetCurrentProcessId(); hdl = OpenProcess(MAXIMUM_ALLOWED, FALSE, pid); - 다른 프로세스 정보 HWND hWnd; DWORD pid; HANDLE hdl; // 윈도우 이름으로 윈도우 핸들을 얻음. hWnd = FindWindow(NULL, L"Window Name"); // hWnd의 pid값 구하기 GetWindowThreadProcessId(hWnd, &pid); // 얻은 pid값으로 대상 프로세스의 핸들을 얻음. hdl = OpenProcess(MAXIMUM_ALLOWED, FALSE, pid); - 여러 프로세스 정보 #include "tlhelp32.h.. 2015. 8. 23.
[Windows] 파일열기 대화상자 (Win32API) 1. 코드 HANDLE hFile; OPENFILENAME OFN; TCHAR lpstrFile[MAX_PATH] = L""; // 필요한 부분에 아래 내용 사용 memset(&OFN, 0, sizeof(OPENFILENAME)); OFN.lStructSize = sizeof(OPENFILENAME); OFN.hwndOwner=hWnd; OFN.lpstrFilter=TEXT("ALL FILE(*.*)\0*.*\0"); OFN.lpstrFile=lpstrFile; OFN.nMaxFile=MAX_PATH; if(GetOpenFileName(&OFN) != 0) { hFile = CreateFile(OFN.lpstrFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTR.. 2015. 8. 22.
[Windows] 관리자 권한 요구하기 (Win32API) Property -> Linker -> Manifest File -> UAC Execution Level 2015. 8. 22.
[Windows] ATL90.dll, MSVCR90.dll 의존성 제거 (Win32API) ATL90.dll [Project] Property -> General -> Use of ATL -> Static Link to ATL MSVCR90.dll [Project] Property -> C/C++ -> Code Generation -> Runtime Library -> /MT 단, Debug로 컴파일 할 경우에는 /MTd 2015. 8. 21.
[Windows] 기본 윈도우 소스 (Win32API) 1. 코드 #include LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HINSTANCE g_Inst; LPCWSTR lpszClass = TEXT("Window"); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszClassParam, int nCmdShow) { HWND hWnd; MSG Message; WNDCLASS WndClass; g_Inst = hInstance; WndClass.cbClsExtra=0; WndClass.cbWndExtra=0; WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); W.. 2015. 8. 21.