.net – AppDomain.GetCurrentThreadID对于Windows API调用的Thread.ManagedThreadID?

前端之家收集整理的这篇文章主要介绍了.net – AppDomain.GetCurrentThreadID对于Windows API调用的Thread.ManagedThreadID?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试创建一个钩子来监视鼠标光标的当前位置.没有什么重要的,我只需要在界面设计期间计数一些像素,并想要学习如何创建一个钩子,所以我决定采取一个艰难的方式,而不是一个合理的方式.

我发现示例代码声明了以下函数

<DllImport("User32.dll",CharSet:=CharSet.Auto,_
 CallingConvention:=CallingConvention.StdCall)> _
 Public Overloads Shared Function SetWindowsHookEx _
      (ByVal idHook As Integer,ByVal HookProc As CallBack,_
       ByVal hInstance As IntPtr,ByVal wParam As Integer) As Integer
End Function

调用函数时,使用以下代码

hHook = SetWindowsHookEx(WH_MOUSE,_
                                 hookproc,_
                                 IntPtr.Zero,_
                                 AppDomain.GetCurrentThreadId())

但是Appdomain.GetCurrentThreadID会生成警告:“公共共享函数GetCurrentThreadId()As Integer”已过时:AppDomain.GetCurrentThreadId已被弃用,因为当托管线程在光纤上运行时(即轻量级线程)不提供稳定的Id.要获得受管线程的稳定标识符,请使用Thread上的ManagedThreadId属性.

我试过使用ManagedThreadID,但这不行.返回的线程ID似乎是线程的逻辑线程ID,因为它在.net运行时运行,而不是Win32线程标识符.

调用函数ith AppDomain.GetCurrentThreadID有效,但我真的希望有一个“稳定的标识符”为我的线程.

有人向我解释,是否可以在这个上下文中使用ManagedThreadID(我假设没有),如果没有,我需要避免的事情,以阻止AppDomain.CurrentThreadID变得“不稳定”?

干杯

在这种情况下不可能使用ManagedThreadId.这是一个完全管理的概念,并没有真正的代表在本土的世界.因此,您传递给API的API没有任何意义.

ManagedThreadId存在的原因是因为本机和被管线程之间不一定是1-1映射.只要本地线程与其替换的本机线程兼容,CLR可以自由使用多个本机线程来运行单个托管线程.它不能例如在一个不同的COM公寓.

在某些方面你有点困在这里. AFAIK,没有办法100%保证你将有一个给定的线程相同的本机线程.如果您运行WinForms或WPF应用程序,并且在UI线程上发生对本地代码调用,则可以实现非常高级别的保证.原因是这两个UI框架都存在于STA公寓中,这使得它非常困难(如果可能的话)CLR从您下面切换出来.

简短版本:如果您使用的是WinForms或WPF应用程序,并且在UI线程上运行该应用程序,则可以为此标识符提供合理的稳定级别.

原文链接:https://www.f2er.com/windows/371409.html

猜你在找的Windows相关文章