3

ユーザーがソフトウェアから離れることができるWindows(Xp、Vista、特に7以降)のホットキーを無効にするために必要なコードをソフトウェア内に配置したいと思います。

詳細:

  • コマンドは、ソフトウェアの実行中にのみ有効である必要があります。実行されていないときは、Windowsホットキーを有効にする必要があります(つまり、ユーザーがソフトウェアを起動した場合、ホットキーは無効になります。ユーザーがソフトウェアを閉じた場合は、再度有効にする必要があります)。
  • すべてのWindowsホットキーを無効にしたくないので(ctrl + alt + delなどの一部のキーホットキーは引き続き機能している必要があります)、すべてのホットキーを無効にするある種のWindows構成などのソリューションは役に立ちません。作業を継続したいホットキーと使用しないホットキーを具体的に選択できる必要があります。
  • 「ホットキー」のニックネームには、Windowsボタンが含まれます。
  • コードは、C++またはWindows関数を使用している必要があります。
  • できれば、explorer.exeを終了する必要はありません。

私はここにあるstackoverflowの投稿を見て、私のものと非常によく似たケースを持っていました(ユーザーがシステムホットキーを介してWindowsアプリケーションを終了できないようにします)が、提示されたソリューションのどれも私の特定の状況に適用できると理解している限り、私はWebでも何も見つかりませんでした。

4

2 に答える 2

5

わかりました、私はそれを行う方法を手に入れました。このコードは、低レベルのキーボードフックを使用して、DLLなしでシステム全体のフックを作成できます。コードは次のとおりです(説明する方が良い)(Qtを使用):

//Installing the hook
SWH_return = SetWindowsHookEx(WH_KEYBOARD_LL,LowLevelKeyboardProc,GetModuleHandle(NULL),0);

if (SWH_return != NULL)
    qDebug() << "Hook true";
else
    qDebug() << "Hook false";

//Uninstalling the hook
bool teste = false;

teste = UnhookWindowsHookEx(SWH_return);

if (teste)
    qDebug() << "Unhook: true";
else
    qDebug() << "Unhook: false";

//The function responsible for detecting the keystrokes
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0)
    return CallNextHookEx(NULL, nCode, wParam, lParam);

tagKBDLLHOOKSTRUCT *str = (tagKBDLLHOOKSTRUCT *)lParam;

switch(str->flags)
{
    case (LLKHF_ALTDOWN):
        qDebug() << "ALT";
        delete str;
    return 1;
}

if (wParam == WM_KEYDOWN)
{
    switch (str->vkCode)
    {
        case VK_RWIN:
        case VK_LWIN:
        case VK_LCONTROL:
        case VK_RCONTROL:
        case VK_APPS:
        case VK_SLEEP:
        case VK_MENU:
            qDebug() << "SPECIAL PRESS";
            delete str;
        return 1;
    }
}

return CallNextHookEx(NULL, nCode, wParam, lParam);
}

この最後の関数は、.hまたは.cppファイルでの宣言を必要としません。Ctrl、Windowsキー、Altの入力をブロックします。他の2つは、ユーザーがキーの無効化を開始したいときと停止したいときに、それぞれ関数に配置する必要があります。

ありがとう、

モメルギル。

于 2012-08-16T20:08:11.900 に答える
0

また、RegisterHotKeyは、RegisterHotKey関数呼び出しが行われる場合を除いて、すべてのアプリケーションのホットキーをグローバルに無効にします。

RegisterHotKey(GetSafeHwnd(), 100, 0,VK_F5); //F5 works only in our application
于 2017-10-16T10:22:38.230 に答える