2012-02-29 3 views
0

내 응용 프로그램 사용자가 alt-tab을 사용하지 못하게하고 싶습니다. 낮은 수준의 키보드 후크를 사용하여이 문제를 해결하려고합니다.alt-tab 키보드가 이상한 동작을 일으키고 있습니까?

설정이 완벽하게 작동하면 키 조합 등을 누르면 콜백 절차가 시작됩니다. 이상한 일은 내가 응용 프로그램에서 alt-tab을 사용할 수 있지만 alt-tabbing이 완전히 비활성화되어 있다는 것입니다. 마우스로 응용 프로그램을 전환하고 alt-tabbing을 시도하지만 아무 일도 일어나지 않습니다. 다시 내 응용 프로그램과 alt-tab으로 전환하고 응용 프로그램을 전환하지만 한 단계 만 전환합니다. 내 응용 프로그램에서 alt-tab이 더 이상 작동하지 않을 때.

다른 시나리오를 시도해 보았습니다. 먼저 VS2010의 디버거와 관련이 있다고 생각했지만 디버거를 사용하지 않고 실행하면 동일한 결과가 나타납니다.

이 후크 절차를 완전히 오해 한 적이 있습니까? 응용 프로그램이 초점이 맞지 않을 때 일어나는 일만 잡으려고합니까?

osman.hpp :

static HHOOK m_hhook; 

static LRESULT CALLBACK lowLevelKeyboardProc(int key, WPARAM wParam, LPARAM lParam); 

osman.cpp :

HHOOK OSMan::m_hhook; 

/* 
* pseudo init code 
*/ 
void OSMan::init() 
{ 
    m_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)lowLevelKeyboardProc, 0, 0); 
} 

LRESULT CALLBACK OSMan::lowLevelKeyboardProc(int key, WPARAM wParam, LPARAM lParam) 
{ 
    KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam; 

    switch (key) 
    { 
    case HC_ACTION: 
     { 
      if (pkbhs->vkCode == VK_TAB && pkbhs->flags & LLKHF_ALTDOWN) 
       return 1; 

     } 

    default: 
     break; 
    } 
    return CallNextHookEx(m_hHook, key, wParam, lParam); 
} 

편집 :

  • 코드를 추가했습니다. 당신은 시스템 와이드 훅을 설치하는
+1

후크를 어떻게 설정하고 있는지 보여주는 몇 가지 코드가 도움이 될 것입니다. –

+0

@InS : 누군가가 제한적인 것을 원할 때마다, 사용자가 책이 재고가 있는지 또는 상점에서 고무줄이 재고가 있는지를 알기 원할 때 종종 키오스크 애플리케이션을 구축합니다. – sarnold

+1

@sarnold : 키오스크와 같은 것을 만드는 적절한 방법은 [그룹 정책] (http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=19735)과 같은 운영 체제 기능을 사용하는 것입니다. 별도의 관리자 및 "키오스크"사용자 계정 기본적으로 운영 체제를 손상시키는 소프트웨어 해킹을 개발하는 것보다 적절한 권한으로 컴퓨터 계정을 설정하는 데 시간이 덜 소요됩니다. –

답변

1

, 즉 당신이 전체 시스템에 Alt 키-TAB의 사용을 비활성화하는 이유입니다.

당신은 사용할 수 없습니다 당신이 WH_KEYBOARD 후크를 사용하고, 특정 처리해야 WH_KEYBOARD_LL.

후크 프로세스를 특정화하면 SetWindowsHookEx의 매개 변수가 변경됩니다.

dwThreadId [IN] 타입 : 여기서

는 PARAMS 개요 인 DWORD

후크 과정을 관련 지을 수있는 스레드의 식별자.

이 매개 변수가 0이면 후크 프로시 저는 호출 스레드와 동일한 데스크톱에서 실행중인 모든 기존 스레드와 연결됩니다.

PS : 답변에 댓글을 :

훅은 설치 프로세스가 하나 개의 적절한 이벤트를 얻었다 후. 키보드 메시지에 연결하는 동안 후크가 설치되기 전에 하나 이상의 키보드 메시지를 보내야합니다.

어쩌면 당신이 이 ShowWindow 기능을 사용하여이 문제를 해결하려면

작동합니까? 여기 는 문서입니다 : http://www.pinvoke.net/default.aspx/user32.showwindow

CF : http://www.codeproject.com/Articles/4610/Three-Ways-to-Inject-Your-Code-into-Another-Proces

CF http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspxhttp://msdn.microsoft.com/en-us/library/windows/desktop/ms644959(v=vs.85).aspx#wh_keyboardhook

+0

'SetWindowsHookEx'의 마지막 인수로'WH_KEYBOARD_LL'과'0'을 사용하면, 제가 겪고있는 문제를 일으키지 않을 것입니다. 어떤 이유로 든 내 응용 프로그램에서 여전히 'alt-tab'을 할 수 있지만 응용 프로그램에 초점이 맞지 않으면 'alt-tabbing'이 작동하지 않습니다. - 'alt-tabbing'은 외부에서 작동하지 않습니다. 응용 프로그램은 문제가되지 않습니다 .. 문제가되는 응용 프로그램의 'alt-tabbing'! – Alex

+0

그래서 한 번 alt 탭을 사용할 수 있지만 alt 탭을 완전히 사용할 수 없다는 말입니까? – squelos

+0

네, 그게 제가 경험 한 것입니다. 그러나 응용 프로그램에 다시 집중할 때 다시 한 번 alt-tab을 누른 다음 다시 비활성화 할 수 있습니다. 내 응용 프로그램에 포커스가있을 때 내 후크가 비활성화 된 것처럼 보입니다. – Alex

0

당신이 고도 + 가 제대로 탭, 당신은 단지 RegisterHotKey(0,0,MOD_ALT,VK_TAB);를 통해 단축키를 등록해야 사용하지 않으려면 이 메시지가 생성하는 메시지를 처리 ​​(더 잘 무시)하면 응용 프로그램을 로컬로 만들 수 있으며 걱정하지 않아도됩니다. s 훅 체인을 지원하며 즉시 활성화 또는 비활성화 할 수 있습니다.

게임의 경우 idTech 4 input handling code에는 다양한 입력 젬이 있습니다.

+0

나는 운이없이이 길을 이미 시험해 보았다. 함수 자체가 false를 반환하고 GetLastError() 메소드를 사용할 때 "HotKeyId가 이미 등록되었습니다"또는 그 방향으로 된 것과 같은 것을 들었습니다. – Alex

+0

@Alex : 이전 등록을 취소하면 어떻게됩니까? – Necrolis

+0

그것은 재미있는 일입니다. 오래된 것이 없습니다. 나는 그것이 존재하지 않더라도 그것을 등록하려고 시도했다. 등록 전화를하기 바로 전에 등록 취소 전화를하면됩니다. 차이 없음. – Alex

관련 문제