簡體   English   中英

在C#.NET中子類化外部窗口

[英]Subclassing a external window in C# .NET

我正在嘗試在C#中子類化外部窗口。 我曾在VB6中使用過類似的東西,但是沒有任何問題,但是下面的代碼無法正常工作。 有人可以幫我嗎?

//API

[DllImport("user32")]
private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, IntPtr newProc);

[DllImport("user32")]
private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, WinProc newProc);

[DllImport("user32.dll")]
private static extern IntPtr DefWindowProc(IntPtr hWnd, int uMsg, int wParam, int lParam);

[DllImport("user32")]
private static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, int Msg, int wParam, int lParam);

private delegate IntPtr WinProc(IntPtr hWnd, int Msg, int wParam, int lParam);

private const int GWL_WNDPROC = -4;

private enum winMessage : int
{
    WM_GETMINMAXINFO = 0x024,
    WM_ENTERSIZEMOVE = 0x231,
    WM_EXITSIZEMOVE = 0x232
}

private WinProc newWndProc = null;
private IntPtr oldWndProc = IntPtr.Zero;
private IntPtr winHook = IntPtr.Zero;

//Implementation

public void hookWindow(IntPtr winHandle)
{
    if (winHandle != IntPtr.Zero)
    {
        winHook = winHandle;

        newWndProc = new WinProc(newWindowProc);
        oldWndProc = SetWindowLong(winHook, GWL_WNDPROC,newWndProc);
    }
}

public void unHookWindow()
{
    if (winHook != IntPtr.Zero)
    {
        SetWindowLong(winHook, GWL_WNDPROC, oldWndProc);
        winHook = IntPtr.Zero;
    }
}

private IntPtr newWindowProc(IntPtr hWnd, int Msg, int wParam, int lParam)
{
     switch (Msg)
     {
         case (int)winMessage.WM_GETMINMAXINFO:
             MessageBox.Show("Moving");
             return DefWindowProc(hWnd, Msg, wParam, lParam);

}

好的,我完成了編碼,但是在您的解決方案中,您必須擁有表單解決方案和dll解決方案,並且它可以工作,如果您希望該代碼讓我知道。 但是您不能在同一個exe中子類化。 這樣就可以在c#中完成所有操作,但是當我開始轉換c ++項目時,您確實需要該dll。

都是因為

BOOL WINAPI DllMain(HANDLE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
{
    switch(fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            {
                hInstance=(HINSTANCE)hinstDLL;
            }
            break;
        case DLL_PROCESS_DETACH:
            {
                if((int)hndll>1)
                {
                    SetWindowLong(hndll,GWL_WNDPROC,OldWndHndl);   //Set back the old window procedure
                    return 1;
                }       
            }
    }
}

使用C#是不可能的。 只有不受管理的C / C ++才能做到。

oldWndProc = SetWindowLong(winHook, GWL_WNDPROC,newWndProc); 如果winHook來自另一個進程,它將始終返回0(這意味着失敗)。

參考: https : //social.msdn.microsoft.com/Forums/vstudio/en-US/8dd657b5-647b-443b-822d-ebe03ca4033c/change-wndproc-of-another-process-in-c

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM