1

新しいウィンドウがフォーカスを盗むのを防ぐために、グローバル CBT フック設定を使用しています。ac# app から c++ DLL を注入しています。しばらくは正常に機能し、その後機能しなくなります。タイムアウトかと思いましたが、レジストリの LowLevelHooksTimeout を変更して再起動しました。それは役に立ちませんでした。

私はC ++が得意ではありません。したがって、おそらくそれは私のコードのエラーです。失敗の原因は何ですか?また、名前のマングリングに対処し、そのコードを少しクリーンアップする方法はありますか?

WindowMonitor.cpp

   #include <map>
   #include "stdafx.h"
   #include "header.h"
   using namespace std;

   #pragma data_seg(".TEST")
   HHOOK hook=0;
   #pragma data_seg()
   #pragma comment(linker, "/section:.TEST,rws")

   extern "C"
    {
   __declspec(dllexport) LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
        {
    if (nCode<=0)  return CallNextHookEx(hook, nCode, wParam, lParam);
    if (nCode==HCBT_ACTIVATE)
    {
        try {
            CBTACTIVATESTRUCT* stuff=(CBTACTIVATESTRUCT*) lParam;

            if (stuff!=0)
            {
            if (stuff->fMouse==TRUE)
            {

                return 0;
            }
            if (stuff->fMouse==FALSE)
            {
                return 1;
            }
            }
        }
        catch (exception& e)
        {

        }

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


BOOL APIENTRY DllMain( HMODULE hModule,
                  DWORD  ul_reason_for_call,
                  LPVOID lpReserved
                  )
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:

    break;
}
return TRUE;
}

bool InjectCBTHook()
{

HMODULE hDll;
HOOKPROC cbtProcAddr;
DWORD proc_id;


hDll        = LoadLibraryA("WindowMonitor.dll");
cbtProcAddr = (HOOKPROC)GetProcAddress(hDll, "_CBTProc@12"); 

hook=SetWindowsHookEx(WH_CBT, cbtProcAddr, hDll, 0);

if (hook==0) 
{
    int x=GetLastError();
    return FALSE;
}

return TRUE;
}

bool EjectCBTHooks()
{
 UnhookWindowsHookEx(hook);
 return TRUE;
 }

WindowMonitor.h

#ifndef WM
#define WM
extern "C" {

#define DLLEXPORT  __declspec(dllexport)
  DLLEXPORT bool InjectCBTHook() ;
  DLLEXPORT bool EjectCBTHooks();
}

#endif 

C# P/呼び出し

[DllImport("WindowMonitor.dll", CallingConvention = CallingConvention.Cdecl)]
static extern bool InjectCBTHook();
[DllImport("WindowMonitor.dll", CallingConvention = CallingConvention.Cdecl)]
static extern bool EjectCBTHooks();
4

0 に答える 0