Subclass a native application from C#

断了今生、忘了曾经 提交于 2019-12-11 10:16:12

问题


I want to handle mouse click in a native MFC application from a C# application. To do so I'm trying to subclass the native application. I don't get any errors, but the wndproc are newer invoked.

    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);
    }

Edit: To get the hWnd I use GetForegroundWindow()

What I try to do is is to prevent the application to get the mouse click


回答1:


I think you need to use hooking because SetWindowLong does not work across different processes: have a look here http://www.codeproject.com/Articles/5264/Cross-Process-Subclassing



来源:https://stackoverflow.com/questions/11099546/subclass-a-native-application-from-c-sharp

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!