1

キーボードをフックしようとすると問題が発生します (キーロガーではありません!) Word を自動化しようとしていますが、特定のフックで dll を呼び出しています。

私はデスクトップとノートブックを持っています (2 つは同じウイルス対策 + Windows 7 x64 です)。唯一の違いは、ノートブックでは Windows が新しいバージョンでインストールされていることです。問題: ノートブックではすべて正常に動作します。しかし、デスクトップでは奇妙なことが起こります。フックがインストールされていて、メモ帳を対象としている場合はうまく機能しますが、Word を対象としている場合、フックがインストールされていても、外部関数の呼び出しが抑制されます!

 LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam)
 {
   if (code<0) {
      return CallNextHookEx(HookHandle,code,wParam,lParam);
   }

   bool callNextHook = true;
   if (callFunction != NULL) {
          // ONLY WITH WORD AND ONLY IN THE DESKTOP callFunction SEENS TO BE NULL!!!
          // this is a pointer to a function in main application
      callFunction(code,wParam,lParam,&callNextHook);
   } else {
      ShowMessage("THE UNKNOW ERROR! THIS MESSAGE IS SHOWED, THEN HOOK IS INSTALLED");
   }

   //Call the next hook in the chain
   if (callNextHook) {
      return CallNextHookEx(HookHandle,code,wParam,lParam);
   }

   return 0;
 }

ウイルス対策を無効にしたり、ユーザー アカウント制御を変更したり、管理者としてプログラムを実行したりしましたが、何も機能しません。この違いの原因は何ですか?

4

2 に答える 2

1

おそらく、レジストリの LowLevelHooksTimeout 値に関係しています。

より高速なマシンでは、フックを十分に高速に処理し、タイムアウトを処理するためにデフォルトの 200 ミリ秒未満にすることができます。低速のマシンでは、より困難な時間がかかります。

私にとっては、マシン間で信頼できるようにするために、フックを含むアプリケーションでこの値をデフォルトから 500 ミリ秒 (0x1F4) に上げる必要がありました。

このレジストリ値を変更した結果を確認するには、コンピューターを再起動する必要があります。

ここのドキュメントに関するコメントの 4 番目の段落を参照してください。

LowLevelKeyboardProc コールバック関数

フック プロシージャは、次のレジストリ キーの LowLevelHooksTimeout 値で指定されたデータ エントリよりも短い時間でメッセージを処理する必要があります。

HKEY_CURRENT_USER\コントロール パネル\デスクトップ

値はミリ秒単位です。フック プロシージャがタイムアウトした場合、システムはメッセージを次のフックに渡します。ただし、Windows 7 以降では、フックは呼び出されることなくサイレントに削除されます。フックが削除されたかどうかをアプリケーションが知る方法はありません。

それが役立つことを願っています。

于 2012-10-24T18:35:16.763 に答える
0

rad studio xe2 のバグのようですが、フック dll を xe6 でコンパイルすると問題が解決しました。興味深いことに、このバグと追加のコードにより、たった 1 つの dll で 32 と 64 の両方のプログラムをフックできました。このように、xe2 でコンパイルされた古い dll を引き続き使用します。

于 2016-11-06T11:56:15.607 に答える