프로그래밍

👨‍💻 [CEF] CEF 에서 Ctrl + Mouse Wheal 이벤트를 받으려면 어떻게 해야 하나요?

밝음의기둥 2025. 2. 10. 15:40
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

CEF 에서 Ctrl + Mouse Wheal 이벤트를 받으려면 어떻게 해야 하는지 간략히 알아보았습니다.


질문 >

CEF 에서 Ctrl + Mouse Wheal 이벤트를 받으려면 어떻게 해야 하나요?

답변 >

CEF(Chromium Embedded Framework)에서 Ctrl + 마우스 휠 이벤트를 처리하려면 CefKeyboardHandler와 CefRenderHandler 또는 CefLifeSpanHandler를 활용해야 합니다.


1. Ctrl + Mouse Wheel 이벤트 감지 방법

Ctrl 키와 마우스 휠 이벤트를 조합하여 감지하려면 CefKeyboardHandler::OnPreKeyEvent와 CefRenderHandler::OnScrollOffsetChanged 또는 CefBrowserHost::SendMouseWheelEvent를 활용할 수 있습니다.


2. OnPreKeyEvent를 활용한 Ctrl 키 감지

CEF의 CefKeyboardHandler를 구현하여 Ctrl 키가 눌렸는지 상태를 추적합니다.

Ctrl 키 감지 코드

class MyKeyboardHandler : public CefKeyboardHandler {
public:
    bool ctrlPressed = false;

    bool OnPreKeyEvent(CefRefPtr<CefBrowser> browser,
                       const CefKeyEvent& event,
                       CefEventHandle os_event,
                       bool* is_keyboard_shortcut) override {
        if (event.type == KEYEVENT_RAWKEYDOWN || event.type == KEYEVENT_KEYDOWN) {
            if (event.modifiers & EVENTFLAG_CONTROL_DOWN) {
                ctrlPressed = true;
            }
        } else if (event.type == KEYEVENT_KEYUP) {
            if (!(event.modifiers & EVENTFLAG_CONTROL_DOWN)) {
                ctrlPressed = false;
            }
        }
        return false;  // 다른 핸들러가 이벤트를 계속 처리할 수 있도록 false 반환
    }

    IMPLEMENT_REFCOUNTING(MyKeyboardHandler);
};

✅ ctrlPressed 변수를 사용하여 Ctrl 키가 눌려 있는 상태를 감지합니다.


3. OnMouseWheelEvent를 활용한 마우스 휠 감지

마우스 휠 이벤트를 처리하기 위해 CefRenderHandler 또는 CefBrowserHost::SendMouseWheelEvent를 활용할 수 있습니다.

마우스 휠 이벤트 처리 코드

class MyRenderHandler : public CefRenderHandler {
public:
    bool ctrlPressed = false;

    void OnScrollOffsetChanged(CefRefPtr<CefBrowser> browser,
                               double x, double y) override {
        if (ctrlPressed) {
            if (y > 0) {
                std::cout << "Zoom In (Ctrl + Scroll Up)" << std::endl;
                browser->GetHost()->SetZoomLevel(browser->GetHost()->GetZoomLevel() + 0.1);
            } else {
                std::cout << "Zoom Out (Ctrl + Scroll Down)" << std::endl;
                browser->GetHost()->SetZoomLevel(browser->GetHost()->GetZoomLevel() - 0.1);
            }
        }
    }

    IMPLEMENT_REFCOUNTING(MyRenderHandler);
};

✅ OnScrollOffsetChanged에서 마우스 휠이 움직였을 때 ctrlPressed 변수를 확인하여 줌 동작을 수행합니다.


4. CefClient에서 핸들러 설정

이제 CefClient에서 MyKeyboardHandler와 MyRenderHandler를 설정하여 적용해야 합니다.

핸들러 적용 코드

class MyClient : public CefClient {
public:
    CefRefPtr<MyKeyboardHandler> keyboardHandler;
    CefRefPtr<MyRenderHandler> renderHandler;

    MyClient() {
        keyboardHandler = new MyKeyboardHandler();
        renderHandler = new MyRenderHandler();
    }

    CefRefPtr<CefKeyboardHandler> GetKeyboardHandler() override {
        return keyboardHandler;
    }

    CefRefPtr<CefRenderHandler> GetRenderHandler() override {
        return renderHandler;
    }

    IMPLEMENT_REFCOUNTING(MyClient);
};

✅ CefClient에서 GetKeyboardHandler()와 GetRenderHandler()를 구현하여 핸들러를 설정합니다.


5. 실행 시 적용

CefRefPtr client = new MyClient();
CefBrowserHost::CreateBrowser(window_info, client, "<https://www.example.com>", browser_settings, nullptr);


6. 정리

✅ Ctrl 키 감지는 CefKeyboardHandler::OnPreKeyEvent에서 처리
✅ 마우스 휠 이벤트는 CefRenderHandler::OnScrollOffsetChanged에서 감지
✅ CefClient에서 핸들러를 등록하여 동작

이제 Ctrl + 마우스 휠 이벤트를 감지하여 줌 인/아웃 기능을 구현할 수 있습니다! 🚀



🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌

www.youtube.com

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

지금, 스트리밍이 시작됩니다. 치지직-

chzzk.naver.com


반응형