1

私は1つのアプリケーション使用フックを構築しています。別のアプリケーションを開始したいのですが、アプリケーションを構築した後、アプリケーションは別のアプリケーションの自動化ウィンドウハンドルを取得し、windowhookを設定します。しかし、私はそれを行うことはできません。Plsは私を助けてください:( .私の英語のためのSr

変数 window は、すべてのアプリケーションを取得したときに hwnd であり、windowform が実行されています

private bool AddWnd(int hwnd, int lparam)
{
    if (IsWindowVisible(hwnd))
    {
        StringBuilder sb = new StringBuilder(255);
        string className = GetClassName((IntPtr)hwnd).ToString();
        if (className.Length > 10)
        {
            string getSubStringClassName = className.Substring(0, 11);
            if (getSubStringClassName.Equals("WindowsForm") && IsWindow(hwnd)!=0)
            {
                GetWindowText(hwnd, sb, sb.Capacity);
                window = hwnd;
            }
        }
    }
    return true;
}

HookProc HookProcedure;
private const int WH_CBT = 5;

public void startHook()
{
    if (hHook == 0)
    {
        HookProcedure = new HookProc(CbtHookProc);
        int threadID = GetWindowThreadProcessId((IntPtr)window, out processHandle);
        IntPtr hMod = System.Runtime.InteropServices.Marshal.GetHINSTANCE(typeof(Form1).Module);
        hHook = SetWindowsHookEx(WH_CBT, HookProcedure, hMod, threadID);
        if (hHook == 0)
        {
            MessageBox.Show("SetWindowsHookEx Failed");
            return;
        }
    }
    else
    {
        bool ret = UnhookWindowsHookEx(hHook);
        //If the UnhookWindowsHookEx function fails.
        if (ret == false)
        {
            MessageBox.Show("UnhookWindowsHookEx Failed");
            return;
        }
        hHook = 0;
        button1.Text = "Set Windows Hook";   
    }
}
4

1 に答える 1

1

WH_KEYBOARD_LLマネージド .NET アプリケーションからインストールできるフックは、低レベル キーボード ( ) と低レベル マウス ( ) フックの 2 種類だけですWH_MOUSE_LL。違いは、これら 2 つのフックのコールバック関数が独自のプログラムによって実装されることです。他のすべてのタイプのフックでは、フックされたプロセスに実際に注入できる DLL にコールバック関数を実装する必要があります。マネージ DLL はアンマネージ プロセスに安全に挿入できないため、これはマネージ コードでは機能しません。

したがって、C# コードを修正するために何をしても、これは機能しません。コンピューター ベースのトレーニング フック ( WH_CBT) は、C# アプリまたは DLL からインストールすることはできません。フック DLL を作成するには、別の言語に切り替える必要があります。C と C++ が一般的な選択肢です。

または、別のアプリケーションがウィンドウを作成したときに通知を受け取ることだけが重要な場合は、マネージド アプリから動作するアクセシビリティ API を代わりに使用できます。SetWinEventHook関数の調査を開始します。WINEVENT_OUTOFCONTEXT通知がプロセスに確実に配信されるようにするには、フラグを指定する必要があります。そうしないと、注入可能な DLL が期待されますが、これは動作しません。EVENT_OBJECT_CREATEand/orイベントは、EVENT_OBJECT_SHOW監視したいものです。

于 2013-08-28T22:42:04.737 に答える