当前位置: 首页 > 编程语言 > C#

在C#.NET中对外部窗口进行子类化分享

时间:2023-04-10 14:16:31 C#

C#学习教程:在C#.NET中子类化外部窗口我以前在VB6中使用过类似的东西,没有任何问题,但下面的代码不起作用。有人可以帮助我吗?//API[DllImport("user32")]privatestaticexternIntPtrSetWindowLong(IntPtrhWnd,intnIndex,IntPtrnewProc);[DllImport("user32")]privatestaticexternIntPtrSetWindowLong(IntPtrhWnd,intnIndex,WinProcnewProc);[DllImport("user32.dll")]privatestaticexternIntPtrDefWindowProc(IntPtrhWnd,intuMsg,intwParam,intlParam);[DllImport("user32")]privatestaticexternIntPtrCallWindowProc(IntPtrlpPrevWndFunc,IntPtrhWnd,intMsg,intwParam,intlParam);私人委托IntPtrWinProc(IntPtrhWnd,intMsg,intwParam,intlParam);私有常量intGWL_WNDPROC=-4;privateenumwinMessage:int{WM_GETMINMAXINFO=0x024,WM_ENTERSIZEMOVE=0x231,WM_EXITSIZEMOVE=0x232}privateWinProcnewWndProc=null;私人IntPtroldWndProc=IntPtr.Zero;privateIntPtrwinHook=IntPtr.Zero;//实现publicvoidhookWindow(IntPtrwinHandle){if(winHandle!=IntPtr.Zero){winHook=winHandle;newWndProc=新的WinProc(newWindowProc);oldWndProc=SetWindowLong(winHook,GWL_WNDPROC,newWndProc);}}publicvoidunHookWindow(){if(winHook!=IntPtr.Zero){SetWindowLong(winHook,GWL_WNDPROC,oldWndProc);winHook=IntPtr.Zero;}privateIntPtrnewWindowProc(IntPtrhWnd,intMsg,intwParam,intlParam){switch(Msg){case(int)winMessage.WM_GETMINMAXINFO:MessageBox.Show("Moving");返回DefWindowProc(hWnd,Msg,wParam,lParam);}好的,我完成了编码,但在您的解决方案中,您必须具有表单解决方案和dll解决方案,如果您希望该代码让我知道,它可以工作,但您不能在同一个exe中进行子类化。所以它可以在c#中完成,但是当我开始转换我的c++项目时,你确实需要那个dll,因为BOOLWINAPIDllMain(HANDLEhinstDLL,DWORDfdwReason,LPVOIDlpvReserved){switch(fdwReason){caseDLL_PROCESS_ATTACH:{hInstance=(HINSTANCE)hinstDLL;}休息;caseDLL_PROCESS_DETACH:{if((int)hndll>1){SetWindowLong(hndll,GWL_WNDPROC,OldWndHndl);//设置回旧的窗口过程return1;}}}}在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以上是C#学习教程:C#.NET子类化外部窗口分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——本文收集自网络,并非原创代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢