Skip to content

dydtjr1128/Win32_RemoteAssistance_Study

Repository files navigation

Win32_Study

팀 뷰어와 같은 원격 지원 프로그램 개발 공부 용 저장소

gif6

ToDo

  • Add screen capture
  • Improve double buffering
  • Add image compress(JPEG)
  • Add network code(socket)
  • Register service & make installer

Dictionary

스크린 사이즈

  • GetSystemMetrics(SM_CXSCREEN) GetSystemMetrics(SM_CYSCREEN)

    • 스크린의 X 크기, Y크기를 리턴
  • GetWindowRect

    • 윈도우의 현재 위치와 크기를 구해준다. (left, top)은 윈도우의 현재 좌상단 위치를 나타내는데 이 좌표는 전체 화면을 기준으로 한 좌표이다. (right, bottom)은 윈도우의 우하단 위치를 나타내며 역시 전체 화면을 기준으로 한 좌표이다. 윈도우의 현재 크기(폭과 높이)를 구하고 싶으면 right-left, bottom-top을 계산하면 된다.
    • GetWindowRect(GetForegroundWindow(), &rt);// 활성중인 창 크기 가져올때 사용, 다른창 클릭하면 그 창 사이즈 
      GetWindowRect(hWnd, &rt);// 현재 창 사이즈 및 위치
      GetWindowRect(GetActiveWindow(), &rt);// 활성 창 정보
      
  • GetClientRect

    • 윈도우의 작업영역 크기를 계산해 준다. 크기만 계산해 주기 때문에 좌상단(left, top)값은 항상 0,0이며 우하단 좌표(right, bottom)가 곧 윈도우의 크기를 나타낸다. 작업영역이란 윈도우의 타이틀바, 스크롤 바, 경계선, 메뉴 등을 제외한 영역이며 윈도우가 그리기를 하는 대상 영역이다
  • ScreenToClient

    • 화면의 원점을 기준으로 하는 좌표 lpPoint를 hWnd의 작업 영역을 기준으로 하는 좌표로 변환한다. hWnd윈도우의 작업 영역 원점의 화면 좌표가 cx, cy일 때 lpPoint는 lpPoint.x - cx, lpPoint - cy로 변환된다. GetCursorPos, MoveWindow, GetWindowRect 등과 같이 화면 좌표를 리턴하는 함수로부터 작업 영역의 좌표로 변환하고자 할 때 이 함수를 사용한다.

DC 스케일링

  • SetStretchBltMode
    • https://docs.microsoft.com/ko-kr/windows/desktop/api/wingdi/nf-wingdi-setstretchbltmode
    • // 이미지를 축소나 확대를 경우 생기는 손실을 보정해 주는 함수 HALFTONE이 성능 가장 좋다.
      SetStretchBltMode(hMemDC, HALFTONE);
      
      //이미지 사이즈를 변경	
      StretchBlt(hMemDC, 0, 0, , bmpHeight, hScrDC, 0, 0, windowWidth, windowHeight, SRCCOPY);
      
    • 설명
      BLACKONWHITE 제거되거나 존재하는 픽셀의 색상 값을 사용하여 AND 연산자를 수행합니다. 흑백 비트맵의 경우 흰 픽셀을 훼손시키고 검은 픽셀을 보존합니다.
      COLORONCOLOR 픽셀을 삭제합니다. 모두 제거된 픽셀 줄의 정보를 보존하지 않고 삭제합니다.
      HALFTONE 원본 사각형에서 대상 사각형 안의 픽셀 영역으로 픽셀을 보여줍니다. * 대상 픽셀의 평균 색상을 원본 픽셀 색상으로 근사치로 계산합니다.
      WHITEONBLACK 제거되거나 존재하는 픽셀의 색상 값을 사용하여 OR 연산자를 수행합니다. 흑백 비트맵의 경우 검은 픽셀을 훼손시키고 흰 픽셀을 보존합니다.

Error Log

  • 서피스 프로 등 고해상도의 모니터에서 윈도우 DPI 스케일링으로 인해 GetSystemMetrics(SM_CXSCREEN)를 이용한 해상도 값 인식 시 문제 발생


자바의 Swing을 이용한 프로그램에서 Win32로 변경한 이유

  • https://github.com/dydtjr1128/RemoteControl
  • 자바의 원리상 자바에서 이미지를 만들어 화면에 보여 준 후 사용하지않는 이미지를 GC가 바로바로 해제해주지 않는다는 단점 때문에 메모리를 항상 일정 이상 잡아먹는다.
  • System.gc()를 이용해 gc 요청시 발생하는 성능저하
  • 자바 언어의 성능 상의 문제로 Win32에 비해 많은 CPU 및 메모리 자원 사용
  • 에초에 Windows API를 이용한 후킹이 필요하기 때문에jni, jna를 거쳐 사용하는것은 비효율적으로 판단.