1

C# アプリケーションからネイティブ MFC アプリケーションでマウス クリックを処理したいと考えています。そのために、ネイティブ アプリケーションをサブクラス化しようとしています。エラーは発生しませんが、wndproc が新しく呼び出されます。

    private const int GwlWndProc = -4;
    private delegate int Win32WndProc(IntPtr hWnd, int msg, int wParam, int lParam);
    [DllImport("user32")]
    private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, Win32WndProc newProc);

    Win32WndProc _newWndProc = MyWndProc;

    SetLastError(0);
    IntPtr oldWndProc = SetWindowLong(hWnd, GwlWndProc, _newWndProc);
    if (oldWndProc == IntPtr.Zero)
    {
        int errorCode = Marshal.GetLastWin32Error();
        if (errorCode != 0)
            throw new Win32Exception(errorCode);
    }

private int MyWndProc(IntPtr hWnd, int msg, int wParam, int lParam)
    {
        Debug.WriteLine("MyWndProc " + (WindowsMessage)msg);
        if (msg == (int) WindowsMessage.LeftButtonDown)
        {
            MessageBox.Show("Clicked");
            return 0;
        }
        else return CallWindowProc(_subclasses[hWnd], hWnd, msg, wParam, lParam);
    }

編集: hWnd を取得するには、GetForegroundWindow() を使用します

私がやろうとしているのは、アプリケーションがマウスクリックを取得できないようにすることです

4

1 に答える 1

3

SetWindowLong は異なるプロセス間で機能しないため、フックを使用する必要があると思います: ここを見てください http://www.codeproject.com/Articles/5264/Cross-Process-Subclassing

于 2012-06-19T11:01:02.737 に答える