WinXP 에서 Win7 단축키 기능 구현하다가... .NET

Window 7 단축키 중에서 내가 단연코 많이 사용하는 키는 Win+방향키 로 윈도우의 크기를 제어하는 것이다.
근래 불행히도 출근하는 업체의 근무환경 표준이 XP 인 관계로 이 기능을 사용하지 못하니 불편해 죽을 지경이다. 여기저기 서치해보다가 걍 만드는게 편할것 같기도 하고 재미있을것 같기도 해서 블로그를 남긴다.

우선 Keyboard hooking 이 필요하겠다. 구현할려고 하다가 왠지 예전에 어디선가 본거 같아서 서치해보니 역시!

(땡큐 StormySpike)

본 클래스는 사용하기도 굉장히 편리하니 적극 추천! 다른 Appication 을 만드는데도 사용하면 좋을듯 하다.
gkh.HookedKeys.Add(Keys.Left);
gkh.HookedKeys.Add(Keys.Right);
gkh.HookedKeys.Add(Keys.Up);
gkh.HookedKeys.Add(Keys.Down);
이렇게만 써주면 된다.

그다음 GetAsyncKeyState 함수를 사용하여 Win 키가 Pressed 상태인지 체크하고 위의 Hooking 클래스에서 윈도우의 크기나 상태를 제어해주는것이 관건. 참고로 윈도우의 상태를 제어하기 위해서는 ShowWindow 함수를, 윈도우의 크기를 제어하기 위해서는 MoveWindow 를 사용하였다. 

풀지못한 이라기 보단 조금 귀찬은 작업은 남겨두었는데 왼쪽 혹은 오른쪽으로 붙어 있는 윈도우를 이전 크기로 되돌리는 기능은 구현하지 않고 그냥 일정한 크기의 윈도우로 센터에 표시되도록 남겨두었다.(예를 들면 왼쪽에 Docking 되어 있는 윈도우를 Win+Right Arrow 입력시 이전 크기의 위도우로 되돌아와야 하는게 원래 Win7 의 그것이었다면 나는 그냥 센터에 일정한 크기로 표시되도록 한 것) 기존 윈도우 핸들값으로 최초의 윈도우 크기를 기억해 놓으면 될것 같으나... 굳이 그래야 하나 싶은 귀찮음에...
아 또 있다. 듀얼 모니터인 경우의 처리. 음... 또 있나?! ^^;;

이게 소스나 작업의 순서를 올리지 못하니 답답하고만... 뭐 별수 없다.
이거참 얼릉 여길 벗어나던지..이런걸만들고 있는 나도 참...


덧글

  • 짜두르 2012/01/03 16:09 # 답글

    음 그게 저도 공유해드리고 싶으나... 첨부파일을 올릴수 없는 환경이라... 소스만 대략 옴겨보자면,
    이 블로그의 링크에 있는 솔루션에 gkh_KeyUp 라는 이벤트가 있는데요, 이 부분을 수정해주시면 됩니다. 이 이벤트 안에서 Keys currentKey = e.KeyData; 를 하면 현재 눌러진 다른 키를 가져오는 것이죠.
  • 짜두르 2012/01/03 16:14 # 답글

    대략 제가 만든 코드는 아래와 같습니다.
    private void Form1_Load(object sender, EventArgs e)
    {
    gkh.HookedKeys.Add(Keys.Left);
    gkh.HookedKeys.Add(Keys.Right);
    gkh.HookedKeys.Add(Keys.Up);
    gkh.HookedKeys.Add(Keys.Down);

    //gkh.KeyDown += new KeyEventHandler(gkh_KeyDown);
    gkh.KeyUp += new KeyEventHandler(gkh_KeyUp);
    }

    void gkh_KeyUp(object sender, KeyEventArgs e)
    {
    IntPtr activeWindowHandle;
    Keys currentKey;
    if (gkh.IsKeyDown(Keys.LWin))
    {
    lstLog.Items.Add("Upt" + e.KeyCode.ToString());

    activeWindowHandle = globalKeyboardHook.GetForegroundWindow();
    currentKey = e.KeyData;

    if (CheckWindowState(activeWindowHandle, currentKey))
    {
    e.Handled = true;
    return;
    }
    // 실제 윈도우를 이동시켜주는 메소드
    MoveWindowUsingKey(activeWindowHandle, currentKey);
    e.Handled = true;
    }
    }
  • 짜두르 2012/01/09 09:12 # 답글

    왼쪽으로 정렬되어 있는 경우에는 윈도우 포지션의 X 와 Y 가 모두 0 인 경우로 하면 되지 않을까요?
    덧붙여 체크하려면 현재 윈도우의 Width 가 Screen 크기의 1/2 인 경우까지 체크해 주면 될듯 합니다~
댓글 입력 영역