2012-02-29 23 views
0

私は、Alt + Tabキーを使用してから自分のアプリケーションのユーザーを禁止します。私は低レベルのキーボードフックを使用してこれを解決しようとしています。完璧な作品を、それを設定キーボードは、奇妙な行動を起こしAlt + Tabキーをフック?

は、コールバックプロシージャは、私はなどのキーの組み合わせを押したときに起こる奇妙なことは、完全に、私は、アプリケーションの外タブをALTすることができますが、その後、ALT-Tabキーが無効になっているということですトリガされます。私はマウスでアプリケーションを切り替え、alt-tabbingを試してみるが、何も起こらない。私は自分のアプリケーションとalt-tabにもう一度切り替えて、アプリケーションを切り替えますが、1つのステップだけです。私のアプリケーションの外に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/downloads/en-us/details.aspx?displaylang=ja&id=19735)のようなオペレーティングシステムの機能を使用することです。別の管理者と「キオスク」ユーザーアカウント。基本的には、オペレーティングシステムを損なうように設計されたソフトウェアハックを開発しようとするよりも、適切な権限でコンピュータアカウントをセットアップする時間が短くなります。 –

答えて

1

は、それはあなたが、システム全体のAlt-TABの使用を無効にしている理由です。

あなたはWH_KEYBOARDフックを使用し、それが特定のプロセスにする必要がありますWH_KEYBOARD_LLを使用することはできません。

フックプロセスを特定すると、SetWindowsHookExのパラメータが変更されます。ここ

はparamsはの概要である:

のdwThreadId [IN] タイプ:DWORD

フックプロシージャが関連付けられるスレッドの識別子。このパラメータがゼロの場合

は、フックプロシージャは、呼び出し側スレッドと同じデスクトップで実行されているすべての既存のスレッドに関連付けられています。

PS:返事にコメントする:

フックのみがインストールされているプロセスは1つの適切なイベントを得た後。キーボードメッセージに引っ掛けながら、あなたはフックがインストールされる前に、少なくとも1つのキーボードメッセージを送信する必要があります。

アラウンド

作業はたぶん、あなたはのShowWindow機能を使って、この問題を回避したいですか?ここ は、docです: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タブを1回だけ使えると言っていますが、altタブは完全に無効になっています。 – squelos

+0

はい、それは私が経験していることです。しかし、私が再び自分のアプリケーションに焦点を合わせると、もう一度 'alt-tab'をやり直すことができました。だから、私のアプリケーションがフォーカスしているときにフックが無効になっているようです。 – Alex

0

あなたは正しくALT + タブを無効にしたい場合は、あなただけのRegisterHotKey(0,0,MOD_ALT,VK_TAB);を経由してホットキーを登録する必要がありますこれが生成するメッセージを処理(よく無視する)してください。これにより、アプリケーションをローカルにすることができます.Windowsについて心配する必要はありませんあなたはすぐにそれを有効または無効にすることができます。

ゲームの場合、idTech 4 input handling codeには膨大な数の入力宝石があります。

+0

私はすでにこのルートを運が無くても試しました。機能自体はfalseを返し、メソッドを 'のGetLastError()を使用する場合、'私は「HotKeyIdが既に登録されている」またはその方向で何かのようなものをrecived。 – Alex

+0

@Alex:古いものを登録解除するとどうなりますか? – Necrolis

+0

それは面白いことですが、古いものはありません。たとえそれが存在しないとしても、私はそれを登録解除しようとした。私が登録をした直前に登録解除コールをするだけです。変わりはない。 – Alex