카테고리 없음

Macbook Pro에 윈도우즈 설치하기

Wood Pecker 2025. 12. 26. 12:22

1. 개요
    Macbook pro 15inch 2017 i7 2.8Ghz Quad Core를 윈도우즈 전용으로 사용하려고 다음과 같은 작업을 수행한다. 

   인텔CPU를 사용하는 경우 맥운영체제를 완전히 제거하고 윈도우즈만 설치할 수 있다. 

2.  Microsoft 공식 사이트에서 Windows ISO 다운로드(별도의 윈도우즈 PC에서 작업)
      https://www.microsoft.com/ko-kr/software-download/windows11  
      x64 디바이스용 Windows 11 디스크 이미지(ISO) 파일을 다운로드한다. 
3.  Rufus 실행    https://rufus.ie/ko/  에서프로그램다운받아서 USB메모리를 부팅 전용 iso로 만든다. 


4.  맥북에서 부팅디스크 선택
      맥북의 정확한 모델명을 먼저 알아야 한다. 맥에서 "이 Mac에 관하여"를 클릭하여 알아본다. 
      예) MacBookPro14,3

     이제 윈도우를 설치한다.  ISO USB를 맥북에 연결하고 아래와 같이 부팅한다. 
     Mac 전원 끄기 => 전원 켜자마자 ⌥ Option 키 길게  =>  EFI Boot / Windows USB 선택

 

5.  윈도우즈 설치
     윈도우즈가 설치되면 USB메모리 카드를 제거하고 부팅을 한다. 아직  Macbook의 키보드 및 마우스 패드는 사용할 수 없다. 

     USB 키보드 및 마우스를 사용할 수 있다. 

  

 6. bootcamp 설치
    Macbook의 키보드 마우스 와이파이 등의 하드웨어를 사용하기 위해서는 bootcamp를 설치 하여야 한다.  bootcamp는 애플 홈  페이지에서 다운 받을 수 있다. 그러나 bootcamp는 버전에 민감함으로 나의 노트북의 모델을 정확히 알아야 한다. 
먼저 별도의 PC에서 brigader를 설치하고 이를 이용하여 해당 모델에 맞는 bootcamp를 다운로드를 한다. 

https://github.com/timsutton/brigadier

다운로드 프로그램을 이용하여 다음과 같이 bootcamp를 다운로드 받는다.   예) BootCamp-041-89072.zip

 

압축을 해제하고 윈도우즈가 설치된 맥북에서 폴더  BootCamp-041-89072\BootCamp에서  setup 프로그램을 실행한다.
모델명을 모른다면 윈도우즈가 설치된 맥북에서 파워셀을 실행하고 아래 명령어를 실행한다.
  > wmic csproduct get name
bootcamp를 설치하였으면 윈도우즈를 재부팅한다.

7. 문제점 해결

맥북의 키보드 무선랜등의 하드웨어가 정상동작된다. 그러나 여전히 문제점이 많다. 

   (1) 한/영키 전환문제   ~ 마우스로만 한/영 전환만 가능 매우 불편

   (2) 절전모드에서 깨어나지 못하여 매번 재부팅해야 한다.

   (3) 모니터 해상도가 고정되어 있어 변경이 안된다.

   (4) bootcamp메시지: 시스템에 문제가 발생했습니다 복구를 하려면 재시동해야 합니다. 

    (1)번 문제는 시작프로그램에 프로그램을 만들어 등록해서 맥북의 "오른쪽 컴맨드" 키를 감지하고 이를 한/영 변환 키보드 메시지로 전송하는 것으로 해결하였다. (2)번문제는 절전모드 사용 안함으로  설정하였다. (3)(4)는 해결하지 못함. ㅠㅠ
(1)번 문제를 위한 프로그램은 아래의 파이썬으로 제작하고 실행파일 exe로 만들어 시작프로그램 폴더에 복사한다. 

# pip install keyboard
# 실행파일 만들기
# pyinstaller --onefile --noconsole hangleToggle.py
import ctypes
from ctypes import wintypes
import keyboard
import time
import sys

TARGET_SCANCODE = 0x5C          # RIGHT Command scan code (92)
VK_HANGUL = 0x15                # 한/영 토글 VK

user32 = ctypes.WinDLL("user32", use_last_error=True)

INPUT_KEYBOARD = 1
KEYEVENTF_KEYUP = 0x0002
ULONG_PTR = wintypes.WPARAM

class MOUSEINPUT(ctypes.Structure):
    _fields_ = [
        ("dx", wintypes.LONG), ("dy", wintypes.LONG),
        ("mouseData", wintypes.DWORD), ("dwFlags", wintypes.DWORD),
        ("time", wintypes.DWORD), ("dwExtraInfo", ULONG_PTR),
    ]

class KEYBDINPUT(ctypes.Structure):
    _fields_ = [
        ("wVk", wintypes.WORD), ("wScan", wintypes.WORD),
        ("dwFlags", wintypes.DWORD), ("time", wintypes.DWORD),
        ("dwExtraInfo", ULONG_PTR),
    ]

class HARDWAREINPUT(ctypes.Structure):
    _fields_ = [("uMsg", wintypes.DWORD), ("wParamL", wintypes.WORD), ("wParamH", wintypes.WORD)]

class INPUT_UNION(ctypes.Union):
    _fields_ = [("mi", MOUSEINPUT), ("ki", KEYBDINPUT), ("hi", HARDWAREINPUT)]

class INPUT(ctypes.Structure):
    _anonymous_ = ("u",)
    _fields_ = [("type", wintypes.DWORD), ("u", INPUT_UNION)]

user32.SendInput.argtypes = (wintypes.UINT, ctypes.POINTER(INPUT), ctypes.c_int)
user32.SendInput.restype = wintypes.UINT

def send_vk(vk: int):
    down = INPUT(type=INPUT_KEYBOARD, ki=KEYBDINPUT(wVk=vk, wScan=0, dwFlags=0, time=0, dwExtraInfo=0))
    up   = INPUT(type=INPUT_KEYBOARD, ki=KEYBDINPUT(wVk=vk, wScan=0, dwFlags=KEYEVENTF_KEYUP, time=0, dwExtraInfo=0))
    arr = (INPUT * 2)(down, up)
    user32.SendInput(2, arr, ctypes.sizeof(INPUT))

pressed = False

def on_rwin_event(e: keyboard.KeyboardEvent):
    """
    이 핸들러는 suppress=True로 등록되므로,
    Right Win(오른쪽 Command) 키 이벤트가 OS로 전달되지 않습니다.
    """
    global pressed

    # 혹시라도 같은 훅에 다른 키가 섞일 수 있어 scan_code로 한 번 더 안전 체크
    if e.scan_code != TARGET_SCANCODE:
        return

    if e.event_type == "down":
        if not pressed:
            pressed = True
            send_vk(VK_HANGUL)  # 한/영 토글만 수행
    elif e.event_type == "up":
        pressed = False

def main():
    # Right Windows 키만 따로 훅 + 전파 차단
    keyboard.hook_key("right windows", on_rwin_event, suppress=True)

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        sys.exit(0)

if __name__ == "__main__":
    main()

 

 

반응형