10

画面に描画できるように、サードパーティのアプリをフックしようとしています。画面への描画は簡単で、助けは必要ありませんが、 を使用SetWindowsHookExして処理するのに問題があるようですWH_GETMESSAGE。最後の 2 つのパラメーターに何を渡せばよいかわかりません。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowDrawer
{
    public partial class Form1 : Form
    {
        private delegate int HookProc(int code, IntPtr wParam, IntPtr lParam);
        static IntPtr hHook;
        IntPtr windowHandle;
        uint processHandle;

        HookProc PaintHookProcedure;     

        [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
        static extern System.IntPtr FindWindowByCaption(int ZeroOnly, string lpWindowName);

        [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetWindowsHookEx", SetLastError = true)]
        static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);

        [System.Runtime.InteropServices.DllImport("user32.dll")]
        static extern int CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

        // When you don't want the ProcessId, use this overload and pass IntPtr.Zero for the second parameter
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

        [System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet =System.Runtime.InteropServices.CharSet.Auto)]
        public static extern IntPtr GetModuleHandle(string lpModuleName);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        { 
            PaintHookProcedure = new HookProc(PaintHookProc);
            windowHandle = FindWindowByCaption(0, "Untitled - Notepad");
            uint threadID = GetWindowThreadProcessId(windowHandle, out processHandle);
            IntPtr hMod = System.Runtime.InteropServices.Marshal.GetHINSTANCE(typeof(Form1).Module);

            // HERE IS THE PROBLEM.  WHAT THE HECK DO I PASS INTO THE LAST 2 PARAMS?  I get a null pointer
            hHook = SetWindowsHookEx(WH_GETMESSAGE, PaintHookProcedure, hMod, threadID);
        }

        public int PaintHookProc(int nCode, IntPtr wParam, IntPtr lParam)
        {
           // Do some painting here.
            return CallNextHookEx(hHook, nCode, wParam, lParam); 
        }

        private const int WM_PAINT = 15;
        private const int WH_GETMESSAGE = 3;
    }
}
4

7 に答える 7

15

SetWindowsHookExは、最後の 2 つのパラメーターを次のように指定します。

  • hMod

[in] lpfn パラメーターが指すフック プロシージャを含む DLL へのハンドル。dwThreadId パラメータが現在のプロセスによって作成されたスレッドを指定し、フック プロシージャが現在のプロセスに関連付けられたコード内にある場合は、hMod パラメータを NULL に設定する必要があります。

  • dwThreadId

[in] フック プロシージャを関連付けるスレッドの識別子を指定します。このパラメーターが 0 の場合、フック プロシージャは、呼び出し元のスレッドと同じデスクトップで実行されているすべての既存のスレッドに関連付けられます。

必要な方法で .NET dll を使用できるかどうかはわかりませんが、試してみることはできます。

Marshal.GetHINSTANCE(typeof(Form1).Module)およびProcess.ThreadshMod経由で取得します。または、グローバル フック (つまり、現在のデスクトップ内のすべての呼び出しに対するフック) が必要な場合は 0に設定しますが、パフォーマンスの低下に注意してください。dwThreadIddwThreadIdGetMessage()

于 2009-11-28T02:59:31.823 に答える
9

以下は、これが機能しないことを示唆しています。

「グローバル フックは .NET Framework ではサポートされていません。WH_KEYBOARD_LL 低レベル フックと WH_MOUSE_LL 低レベル フックを除いて、Microsoft .NET Framework でグローバル フックを実装することはできません。」

Visual C# .NETでWindowsフックを設定する方法」より

于 2013-03-26T21:48:13.550 に答える
3

わかりませんが、APIが「DLLを別のプロセスに挿入する」と言うように、必要なことを指定するパラメーター値を使用している場合、管理されていないDLLを作成した場合にのみ機能する可能性があることはわかっていますどちらから呼び出すか。

于 2009-11-28T03:04:14.917 に答える
3

これは古い質問であることは知っていますが、これが役立つと思う人がまだいることを願っています。私はあなたが混同していると思いintますIntPtr

[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern int CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
于 2012-01-03T02:27:27.353 に答える
3

P/InvokeGetModuleHandleの 3 番目のパラメーターに返されるハンドルを使用する必要があると思いますSetWindowsHookEx。また0、サードパーティのアプリケーションで特定のスレッドをフックしたくないため、4 番目のパラメーターも正しいと思います。

これがうまくいかない場合は、SetWindowsHookExMSDN が正しい方向を示している可能性があります。

于 2009-11-28T02:58:11.200 に答える