首页
学习
活动
专区
圈层
工具
发布

.NETC# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑

的句柄(可在 dll 的入口函数中获取);而我们是托管代码 dwThreadId 是线程 Id,传入 0 则为全局所有线程,否则传入特定的线程 Id 需要注意的坑 模块句柄传什么?...本文一开始被注释掉的代码中,我使用 Marshal 直接从托管程序集中获取了模块句柄。 这里需要说明,托管程序集不能注入到其他进程,因此也不可以挂接钩子。...通过调试也能发现这两个的入口模块是相同的: 至于为什么可以用 user32.dll。...所以更推荐使用前一小节中提供的 LoadLibrary 函数来获取模块句柄,而不是获取当前托管模块的句柄。...办法总还是有的: 可以考虑做非托管 dll,专门用来挂接; 可以考虑使用 SetWinEventHook,这个是不用注入到目标进程的; 可以考虑使用 System.Windows.Automation

2.4K20

WPF 警惕 StylusPlugIn 的多线程安全问题

在 WPF 里面,可以通过 StylusPlugIn 直接从触摸线程获取触摸消息,不需要经过 UI 线程。如此可以实现更低的触摸延迟。...但是 StylusPlugIn 的 OnStylusDown\Move\Up 方法都可能是从触摸线程或 UI 线程调入,需要警惕这里的多线程安全问题 在 WPF 里面,即使是相同的触摸 Id 值,都可能分别在触摸线程或...UI 线程调入,由于多线程调度问题,可能发生触摸事件是先 Up 后 Down 的情况 为什么在 WPF 里面,可能在 UI 线程将触摸消息调入 StylusPlugIn 里面?...我将最简复现 Demo 代码放在本文末尾 再进一步,通过具体的源代码了解此问题复现机制原理 如下图所示,此时触摸消息进入 OnStylusDown 方法的是主线程 一路追踪堆栈,可见这是从主线程的鼠标消息进入触发的...] [托管到本机的转换] WindowsBase.dll!

16510
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C#中DllImport用法汇总

    大家在实际工作学习C#的时候,可能会问:为什么我们要为一些已经存在的功能(比如Windows中的一些功能,C++中已经编写好的一些方法)要重新编写代码,C#有没有方法可以直接都用这些原本已经存在的功能呢...其功能是提供从非托管DLL导出的函数进行调用所必需的信息。DllImport属性应用于方法,要求最少要提供包含入口点的dll的名称。...这个问题最常出现在使用第三方非托管DLL组件的时候,我的也同样是这时出的问题,Asp.Net Team的官方解决方案如下: 首先需要确认你引用了哪些组件,那些是托管的,哪些是非托管的.托管的很好办,直接被使用的需要引用...实际上,你拷贝到bin没有任何帮助,因为CLR会把文件拷贝到一个临时目录下,然后在那运行web,而CLR只会拷贝托管文件,这就是为什么我们明明把非托管的dll放在了bin下却依然提示不能加载模块了。...我们从非托管的定义开始: typedef struct _SYSTEM_POWER_STATUS { BYTE  ACLineStatus; BYTE  BatteryFlag

    2.6K10

    模拟隐蔽操作 - 动态调用(避免 PInvoke 和 API 挂钩)

    使用它,我们展示了如何从内存或磁盘动态调用非托管代码,同时避免 API 挂钩和可疑导入。...此外,此 API 让您可以轻松地在 C# 中从内存中调用非托管代码(传递参数并接收输出),而无需执行一些像自注入 shellcode 这样的变通方法。 我们通过Delegates的魔力实现了这一点。....如果将此与通常在 C# 中从内存中调用非托管代码的方式(通过自注入 shellcode)进行比较,这会容易得多! 定义委托的工作方式类似。您可以定义一个类似于定义变量的委托。...DInvoke 库为每个非托管函数提供了一个托管包装函数。包装器通过确保正确传递参数并返回正确类型的对象来帮助用户。 值得注意的是:PInvoke 比 DInvoke 对数据类型更宽容。...您必须以完全正确的方式编组数据,确保您传入的数据结构在内存中的格式和布局与非托管代码所期望的相同。您还必须指定正确的调用约定。这很烦人。

    2.7K00

    net开发平台regasm注册,gacutil 工具

    (1).regasm.exe文件是什么 首先regasm.exe工具是用来注册net平台这种托管语言编写的dll类库的,包括com扩展。为什么不是regsvr32 呢?...因为net平台生成的并不是真正的二进制文件,无法使用regsvr32 进行注册。... /i D:\wwwroot\c#\Wpc\Wpc\bin\Debug\Wpc.dll 全局注册需要两步,最后一步操作将你的dll文件放到全局程序集缓存目录C:\Windows\Microsoft.NET...gacutil.exe文件必须安装Visual Studio 的ide并且使用ide提供的命令行工具使用 (5).全局注册后想换为非全局注册需要先卸载全局,卸载命令 C:\Windows\Microsoft.NET...(6).低版本的regasm不能注册高net版本的dll (7).一般推荐非全局注册,只要不删除dll即可,毕竟gacutil文件官方不提供

    91510

    C#使用Tesseract C++ API过程记录

    这样可以确保这些函数在C语言中也可以被正确调用。简单的说std::string不是C语言风格的,所以不行。 在C#项目中调用C++ DLL 新建一个C#控制台项目用于测试。...中直接使用 string 作为返回类型并不适用于从C++导出的函数,尤其是当该函数返回的是一个 char* 类型的指针时。...C#的 string 类型是一个托管的字符串对象,而 char* 是一个非托管的指针,直接进行转换会导致运行时错误或无法预期的行为。...使用 IntPtr 作为返回类型可以解决这个问题,因为 IntPtr 是一个可以表示非托管指针的类型。你可以通过 Marshal 类将 IntPtr 转换为C#中的 string。...这样可以确保你在C#中能够正确处理C++函数返回的字符串指针。

    67210

    通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?

    那么在C#角度,那些脱离了.NET提供的诸如垃圾回收器这样的环境管制,就是对应的 非托管了。...非托管的异常 我们编写的程序有的模块是由托管代码编写,有的模块则调用了非托管代码。...,当你打上这行命令并按回车后,必须满足几个条件,1.是.cs后缀的c#格式文件,2.是 代码语法等检测分析必须正确,3.是 使用的类库必须有出处(引用的dll),当然 因为我是编译为控制台程序,所以还必须得有个静态...托管世界的内存不需要我们打理,我们无法从代码中得知具体的托管对象的大小,你如果想追求对内存最细微的控制,显然C#并不适合你,不过类似于有关内存把控的这部分功能模块,我们可以通过非托管语言来编写,然后通过...,仅仅是.NET平台上的,因此它只限制于托管代码,我们可以直接调用非托管代码或进程通信间接调用非托管代码等多个手段来突破对托管代码 操作资源的限制。

    5.7K30

    通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?

    那么在C#角度,那些脱离了.NET提供的诸如垃圾回收器这样的环境管制,就是对应的 非托管了。 非托管的异常 我们编写的程序有的模块是由托管代码编写,有的模块则调用了非托管代码。...,当你打上这行命令并按回车后,必须满足几个条件,1.是.cs后缀的c#格式文件,2.是 代码语法等检测分析必须正确,3.是 使用的类库必须有出处(引用的dll),当然 因为我是编译为控制台程序,所以还必须得有个静态...托管堆模型 而引用类型相比值类型就有点特殊,newobj创建一个引用类型,因其类型内的引用对象可以指向任何类型,故而无法准确得知其固定大小,所以像对于引用类型这种无法预知的容易产生内存碎片的动态内存,我们把它放到托管堆中存储...托管世界的内存不需要我们打理,我们无法从代码中得知具体的托管对象的大小,你如果想追求对内存最细微的控制,显然C#并不适合你,不过类似于有关内存把控的这部分功能模块,我们可以通过非托管语言来编写,然后通过...,仅仅是.NET平台上的,因此它只限制于托管代码,我们可以直接调用非托管代码或进程通信间接调用非托管代码等多个手段来突破对托管代码 操作资源的限制。

    3.6K63

    托管C++、C++CLI、CLR

    不过,通过使用特殊的关键字,C# 数据可以被标记为非托管数据。Visual C++数据在默认情况下是非托管数据,即使在使用 /CLR 开关时也不是托管的。   ...另外,一个托管类也完全可以成为 .NET 框架的成员,由此可以带来的好处是,它可以与其他语言编写的类正确地进行相互操作,如托管的C++类可以从Visual Basic类继承等。...2、为什么使用托管C++   除了可以充分发挥.NET框架新特性外,使用托管C++还有下列好处:   (1) 由于在同一个应用程序中,甚至是同一个文件中,我们可以同时使用托管C++和传统的非托管C+...(2) 使用托管可以从任何一个.NET框架兼容语言中调用一个C++组件,也可调用非托管DLL、其它库以及类等。   (3) 可以直接从非托管代码中访问.NET框架。   ...一个__gc类不能从一个非托管类中继承,且不能包含从它派生的非托管类。但一个__gc类最多可以从一个托管类中继承。   B. 一个__gc类不能定义成一个友元类或包含一个友元成员函数。

    3.5K40

    红队技巧之F#利用

    援引微软官方的解释: F # 是一种函数编程语言,可方便编写正确且可维护的代码。F # 编程主要涉及如何定义自动推断和通用化的类型和函数。...至于为什么要学习F#,其实也是跟C#的道理是一样的,在某些特殊情况下,我们可以利用F#来达到我们的目的,原常景如下: This customer really locked down their environment...但这并不意味着我们便无法在内存中运行我们的F#程序,我们可以使用非托管代码的方法来运行任意的我们的F#程序。...比较好的demo就是: https://github.com/etormadiv/HostingCLR 也就是用非托管来加载CLR实现内存加载。...实现过程如下: 1.将CLR加载到进程中:调用CLRCreateInstance函数以获取ICLRMetaHost或ICLRMetaHostPolicy接口,调用ICLRMetaHost的方法来获取有效的

    1.9K30

    C++ .NET编程:托管C++概述

    默认情况下,C#、Visual Basic 和 JScript.NET 数据是托管数据。不过,通过使用特殊的关键字,C# 数据可以被标记为非托管数据。...另外,一个托管类也完全可以成为 .NET 框架的成员,由此可以带来的好处是,它可以与其他语言编写的类正确地进行相互操作,如托管的C++类可以从Visual Basic类继承等。...(3) 托管C++空项目:用来创建一个空的托管项目,该项目只含有支持托管扩展的正确编译和链接的开关选项。使用它能将一个已有的C++源文件进入到一个托管环境中。    ...一个__gc类不能从一个非托管类中继承,且不能包含从它派生的非托管类。但一个__gc类最多可以从一个托管类中继承。    B. 一个__gc类不能定义成一个友元类或包含一个友元成员函数。...从代码中可以看出设置和获取属性的成员函数名称中分别使用了set_和get_,这样编译器会自动生成一个伪成员变量Size,这个变量名是set_和get_成员函数后面的名称。

    2K20

    ILRuntime热更新

    项目/教程地址:传送门 IL热更优点: 1、无缝访问C#工程的现成代码,无需额外抽象脚本API 2、直接使用VS2015进行开发,ILRuntime的解译引擎支持.Net 4.6编译的DLL 3、执行效率是...除了默认 AppDomain,正在使用非托管COM接口方法 或托管类型方法的宿主还可要求CLR创建额外的 AppDomain。AppDomain是为了提供隔离而设计 的。...=cc7b13ffcd2ddd51”的引用 解决方案:我的默认工程文件框架为4.6.0,更改到更高的版本再进行编译即可生成dll 顺利生成dll文件 安装调试器 报错:安装无法将此扩展安装到所有选定的产品...大规模数值计算:如果在热更内需要进行大规模数值计算,则可以开启ILRuntime在2.0版中加入的寄存器模式来进行优化 避免使用foreach:尽量避免使用foreach,会不可避免地产生GC。...使用MonoBehaviour->不建议) 09.Reflection(主工程反射DLL类型) 热更DLL中使用反射跟原生C#没有区别 Demo主要介绍主工程反射热更DLL中的类型 void OnHotFixLoaded

    3K30

    使用C#+FFmpeg+DirectX+dxva2硬件解码播放h264流

    因此行文看起来会乱一些,如果你看到某处能会心一笑请马上联系我开始摆龙门阵 如果你跟随这篇文章实现了播放器,那你会得到一个高效率,低cpu占用(单路720p视频解码播放占用1%左右cpu),且代码和引用精简(无其他托管和非托管的...安装好dx的sdk后我们得到c#的托管引用dll   第二步是修改ffmpeg源码并编译,我们要修改的源码只有一个文件的十余行,而且是增量修改。...将msys自带link重命名避免冲突 打开msys,查看变量是否正确 ? 检查变量正确性 编译ffmpeg ....进行可能的异常处理(实际上还是推倒重来)   番外篇:C#对DiretX调用的封装 上文中我们使用DirectX的方式看起来即非COM组件,又非C-DLL的P/Invoke,难道DirectX真有托管代码...答案是否定的,C#的dll当然也是调用系统的d3d9.dll。

    3.9K11

    2019-3-7-手把手教你PInvoke

    ---- 这个时候你就会接触到一些美妙的dll,比如user32.dll,kernal32.dll 当然这些是非托管的代码,我们在.net中无法直接使用,所以我们会需要使用PInvoke进行调用 于是你会使用...DllImport特性标记一个方法,引入非托管函数 比如 我们希望弹出一个消息框,就会使用下面这个函数,添加DllImport特性,表明从哪个dll引入方法 public class Win32 {...; } 接着我们从Syntax中找到函数签名 ? 这里比较麻烦的是4个参数的需要转换为对应的托管类型,有时候还会涉及一些结构体和指针。 这里我们先看一下Parameters ?...最后一个是UINT,我们直接在c#中有对应的uint 这么一看是不是就更加能够理解了呢。...实操 再来一个简单的例子,我们期望获取HID设备的接口GUID 方法给到你们,是HidD_GetHidGuid 先看requirements.txt,发现DLL 是Hid.dll ?

    1.1K30

    程序员级别鉴定书(.NET面试问答集锦)

    这里问的是强名称概念。Assembly.Load("foo.dll")加载程序集的方法是否正确? 强签名的程序集与非强签名的程序集有何不同? DateTime 可以为null吗? 什么是 JIT?...因为同样一个名称的文件可能有不同的版本和区域,此时单独靠文件名称,可能会造成不能确定程序集的正确性。 Assembly.Load("foo.dll")加载程序集的方法是否正确?...Finalize只释放非托管资源; Dispose释放托管和非托管资源 Finalize和Dispose共享相同的资源释放策略,因此他们之间也是没有冲突的。 Using()模式有用吗?...为什么用,或为什么不用它? Debug和Release编译产出物不一样,Release下无调试信息,如Assert无法使用。对程序运行速度而言,无明显区别。...先调用了this(),即无参构造函数,再调用了自身的有参的构造函数。 因为未对a参数进行处理,故无用。 This是什么?可以在静态方法中调用 this 吗?

    2.3K70

    .NET Core多线程 (1) Thread与Task

    从时间和空间角度理解线程的开销 (1)多线程的优点 提高响应能力 main thread:更新UI的东西 work thread:耗时的操作 提高程序性能 1个力工:1个月...10个力工:3天~5天 (2)线程有哪些开销 空间上的开销 数据结构上的开销 C#:Thread CLR:Thread(C++写的) OS:Thread 线程栈开销...dllmain 非托管dll 上面上游 dllmain thread 在start时 会通知这些 非托管dll thread 在exit时 也会通知这些非托管dll(资源清理)...Task:基于ThreadPool的上层封装 线程池的使用及分析其设计思想 (1)为什么要使用线程池?...Task及如何运用其编排能力 (1)Task的设计思想 为什么会出现Task: 获取Thread的返回值比较麻烦 多个Thread的串行实现比较麻烦 Thread的父子关系实现比较麻烦(比如

    84430

    苏州同程旅游学长给我的全面的面试知识库

    我们已经介绍了50多种基本知识,以推进常见的C#面试问题和答案 2、什么是C#? C#是一种面向对象的,类型安全的托管语言,由.Net框架编译以生成Microsoft中间语言。...不,不能执行多个类似类型的捕获块。一旦执行了正确的捕获代码,控制就会转移到finally块,然后执行finally块之后的代码。 5、 public,static和void之间有什么区别?...我们可以轻松地将自定义控件添加到多个应用程序(如果共享的Dll)。因此,如果它们是私有的,那么我们可以将其复制到dll到Web应用程序的bin目录中,然后添加引用并可以使用它们。...他们有自己的设计和代码背后。用户控件的文件扩展名为ascx。 17、 C#中的密封类是什么? 当我们想限制继承的类时,我们创建密封的类。密封的修饰符,用于防止从类派生。...当我们希望对象与它们一起释放任何非托管资源时,将调用Dispose()。另一方面,Finalize()用于相同的目的,但不能保证对象的垃圾回收。 28、什么是循环引用?

    4.2K20

    C# DllImport的用法

    大家在实际工作学习C#的时候,可能会问:为什么我们要为一些已经存在的功能(比如Windows中的一些功能,C++中已经编写好的一些方法)要重新编写代码,C#有没有方法可以直接都用这些原本已经存在的功能呢...答案是肯定的,大家可以通过C#中的DllImport直接调用这些功能。...DllImportAttribute 属性提供对从非托管 DLL 导出的函数进行调用所必需的信息。作为最低要求,必须提供包含入口点的 DLL 的名称。...我们从非托管的定义开始: typedef struct _SYSTEM_POWER_STATUS { BYTE  ACLineStatus; BYTE  BatteryFlag; BYTE ...,因此我们使用 byte 作为该 enum 的基本类型 示例四:处理字符串 二 C# 中调用C++代码 int 类型 [DllImport(“MyDLL.dll”)] //返回个int 类型

    1.4K10
    领券