首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在控制台程序中监听 Windows 前台窗口的变化

本文会介绍两类知识,一类是如何在 .NET/C# 程序中方便地调用 Win32 API,另一类是在控制台程序中开启 Windows 消息循环。...GetMessage 会阻塞当前线程,直到有消息到达 DispatchMessage 会将消息传递给 WinEventProc,这样 WinEventProc 才会被调用 P/Invoke 这里,我使用的是...microsoft/CsWin32,因为我只会用到少数几个 Win32 函数,不希望引入庞大的 P/Invoke 相关的库。....NET/C# 程序如何在控制台/终端中以字符表格的形式输出数据 - walterlv 开源项目 本文的代码已经开源在 GitHub 上,感兴趣可以去项目中阅读更新的代码: https://github.com...set of Win32 P/Invoke methods and supporting types to a C# project.

56620

import duties(Python import变量)

最近在读《编程之美》,打算用C#实现其中一个题目,就是如何控制CPU的使用率在50%,使得在资源管理器中CPU利用率维持在一条直线。...但这个API只能在C++调用,那么在C#如何调用呢?更进一步,就是在C#里为什么没有全部的WIN32 API可以调用呢?有没有方法可以实现呢? 读了一堆C#的帖子和GOOGLE了一通后,发现了原因。...平台调用 (P/Invoke) 是完成这一任务的最常用方法。要使用 P/Invoke,您可以编写一个描述如何调用函数的原型,然后运行时将使用此信息进行调用。...其实就是用DllImport来声明属性和API,然后直接在C#调用。...如果你调用的过程中得不到预想的结果,而且也没抛异常,可以用Marshal.GetLastWin32Error()来得到错误号。

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

使用Label标签控件模拟窗体标题的移动及窗体颜色不断变换

开发工具:VS2017 语言:C# DotNet版本:.Net FrameWork 4.0及以上 一、使用的WIN32 API有两个,一个为ReleaseCapture,另外一个为SendMessage...一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内。同一刻只能有一个窗口捕获鼠标。如果鼠标光标在另一个线程创建的窗口上,只有当鼠标键按下系统才将鼠标输入指向指定的窗口。...SendMessage函数:该函数是用来给窗体发送Windows消息, 在本文中,该函数是模拟给非窗体客户区域(如窗体标题、最大化、最小化及关闭按钮区域)发送Windows消息,使特定区域能收到拖动窗体标题的消息...(); SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); } 其中,WM_NCLBUTTONDOWN(0x00A1),用来给非客户端发送左键按下消息...五、源代码及EXE如下: 源代码: https://pan.baidu.com/s/1dEOhx8P EXE: https://pan.baidu.com/s/1o87QncY

1.5K00

.NET Core 如何判断程序是否在远程桌面(RDP)下运行

那么其他类型的 .NET Core 程序如何判断自己是否在 RDP 下运行呢?我们需要 P/Invoke 骚操作。....NET Core 使用 P/Invoke 的姿势和 .NET Framework 几乎一致。只要一个 [DllImport] 标记即可。...使用 P/Invoke 判断一个 Console 程序是否运行在 RDP 下的代码如下: static void Main(string[] args) { bool isRDP = GetSystemMetrics...运行效果 不过这种技巧大家平时正常写代码的时候一定要尽量避免,在 .NET 的托管环境下调用非托管代码不仅会导致程序和平台及系统版本耦合,还易爆,爆完还难以抓异常信息。...有关 P/Invoke 的详细介绍,请参考微软文档:https://docs.microsoft.com/en-us/dotnet/standard/native-interop/pinvoke

2.5K10

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

如果要知道如何使用这个 API,你可以在网上搜到大量这样的文章/博客/教程/文档,然而大多不会提及使用此 API 遇到的一些坑。...的调用,所以自然少不了 P/Invoke(平台调用)。...如何只处理特定窗口的消息消息循环属于“线程”,而不是属于某个窗口或者进程。...在 CreateWindowEx 创建窗口传入的消息处理函数会仅处理特定窗口的消息,然而当通过钩子的方式来处理消息的话,无法精确定位到某个特定的窗口,只能针对消息循环所在的线程。...因此,要处理特定窗口的消息,只能先拿到此窗口所在的线程。 前面的 P/Invoke 中我也预留了获取窗口所在线程的方法。因此,可以直接使用以下调用来获取 hWnd 句柄窗口所在的线程。

50120

分享一篇开发杂文

2、不同的如何发送如何接收 所有处理的过程全部在另外的类里体现,采用单例模式,提供一个启动的方法,调用此方法开启接收和发送的任务 Task taskSend = Task.Factory.StartNew...C#为同步提供了 Monitor、Mutex、AutoResetEvent 和 ManualResetEvent 对象来分别包装 Win32 的临界区、互斥对象和事件对象这几种基础的同步机制。...1.5.3 避免不必要的抛出异常 抛出异常捕获异常属于消耗比较大的操作,在可能的情况下,应通过完善程序逻辑避免抛出不必要不必要的异常。与此相关的一个倾向是利用异常来控制处理逻辑。...但是有不少代码,捕获异常没有做任何处理就再次抛出,这将无谓地增加一次捕获异常和抛出异常的消耗,对性能有伤害。 ...1.6.2 动态创建对象 C#主要支持 5 种动态创建对象的方式:  1. Type.InvokeMember  2. ContructorInfo.Invoke  3.

86410

基础:C# try catch finally异常处理(Exception)

C# 中try块可以捕获测试代码块中的错误。catch块可以处理错误。finally块无论是否try和catch块出现异常都可以执行代码。...本文主要介绍C# try catch finally异常处理(Exception)。...1、C# Exceptions 执行C# 代码,可能会发生不同的错误异常:程序员编写的编码错误,由于输入错误引起的错误或其他不可预见的情况。 发生错误时,C# 通常会停止并生成错误消息。...InvalidOperationException 当对方法的调用对对象的当前状态无效,由某些方法引发。 ArgumentException 所有参数异常的基类。...ComException 包含COM类的HRESULT信息的异常。 SEHException 封装Win32结构异常处理信息的异常。 SqlException 封装了SQL操作异常

11910

通过子类化窗口(SubClass)来为现有的某个窗口添加新的窗口处理程序(或者叫钩子,Hook)

对于 .NET/C# 来说,我们需要拿到窗口句柄,拿到一个消息处理函数的指针。...在示例的消息处理函数中,我示例处理了一下 WM_NCHITTEST(虽然依然什么都没做)。最后,必须调用 CallWindowProc 以调用此前原来的那个消息处理函数。...最后,如果你又不希望处理这个消息了,那么使用以下方法注销掉这个委托: 1 2 // 嗯,没错,就是前面更换消息处理函数返回的那个指针。...SetWindowLongPtr(hWnd, GWL_WNDPROC, _originalWndProc); 上面需要的所有的 P/Invoke 我都贴到了下面,需要的话放到你的代码当中。...: .NET/C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑 - walterlv 参考资料 Using Window Procedures - Win32 apps

25330

WPF 的 Dispatcher 为什么要创建一个隐藏窗口?

) - Win32 apps - Microsoft Learn 发送消息到线程 PostThreadMessageA function (winuser.h) - Win32 apps - Microsoft...按文中的说法,如果我们使用 PostThreadMessage 来发送消息给这个线程的消息队列,那么当此线程处于模态消息将丢失,除非使用特定于线程的挂钩。...然而,如果 WPF 的 Invoke 机制没有使用 Message-Only 窗口,那么 DispatchMessage 的转发将没有其他途径可以调用Invoke 中的那些操作;唯一能处理 Invoke...设想,有一个开发者在处理某条消息的时候自己创建了一个新的消息循环(即嵌套的消息循环),那么那个开发者必须在自己的消息循环里调用一下 Invoke 中的那些操作,否则那些操作将没有任何机会被执行!...就能完成 Invoke 那些操作的处理,而开发者们绝对不会忘了调用这个函数(否则你的程序根本无法工作)。

18620

OffenSive Csharp Development Part1

win32调用 在整个Csharp的使用过程中,最重要的就是win32调用,由于Csharp不向C/C++可以直接调用win32api进行使用,所以我们一般使用一种叫做P/Invoke的方法在DLL...docs.microsoft.com/en-us/archive/msdn-magazine/2003/july/net-column-calling-win32-dlls-in-csharp-with-p-invoke...其给出了C#以及VB的调用方法,C#调用方法如下: [DllImport("user32.dll", SetLastError = true, CharSet= CharSet.Auto)] public...SharpDump 知道了如何调用win32,下面我们来编写一个dumplsass进程的小程序。...下面就是查找进程的问题了,Csharp提供了Process类,可以直接使用进程名称或者进程ID来进行查找: Process.GetProcessById 最后就是MINIDUMP_TYPE的问题了,这个关系到dump如何

65340

达观金克:RPA界面元素智能自适应定位与操控技术

通过对应用程序窗口发送特定的消息,可以实现对指定界面元素的点击输入等操作。04 模拟键鼠操作模拟键鼠可分为消息模拟、API模拟、驱动模拟三种。...消息模拟基于windows的消息机制,向目标窗口发送键鼠消息。API模拟就是用Windows提供的API实现模拟输入。...然后AccessibleObjectFromWindow函数向Server发送WM_GETOBJECT消息。...例如执行点击按钮操作, UIA 统一归类于Invoke, 无论是Win32、 WPF还是Silverlight按钮,都可以通过Invoke实现点击,不用关心具体实现方式是模拟键鼠还是调用Windows...使用者想要实现点击目标元素,只需要按照统一的规则调用Invoke方法即可,不需要关心该方法底层是如何实现的。定位目标元素还存在一个很常见的问题,目标元素的属性和在UI中的位置偶尔会发生变化。

1.2K10

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

---- 这个时候你就会接触到一些美妙的dll,比如user32.dll,kernal32.dll 当然这些是非托管的代码,我们在.net中无法直接使用,所以我们会需要使用PInvoke进行调用 于是你会使用...DllImport特性标记一个方法,引入非托管函数 比如 我们希望弹出一个消息框,就会使用下面这个函数,添加DllImport特性,表明从哪个dll引入方法 public class Win32 {...所以我们一步步来看如何将c++的MessageBox转化为我们C#中的签名 手把手PInvoke 首先打开Programming reference for Windows API -Microsoft...第2,3个参数都是LPCTSTR LPCTSTR = L‌ong P‌ointer to a C‌onst T‌CHAR String 所以这是一个字符串,我们此处使用string ?...最后一个是UINT,我们直接在c#中有对应的uint 这么一看是不是就更加能够理解了呢。

81530

总结到目前为止发现的所有EDR绕过方法

列出的工具/技术可能并不详尽,但肯定有助于获得良好的概述,并在必要更好地了解如何使用它们。...P/Invoke to D/Invoke @TheRealWover发布了一个名为D/InvokeC#库。...生成的PoC代码DInvisibleRegistry可用于查找不同的D/Invoke实现方法,并且在我看来非常有用和易于理解 P/Invoke基本上是从Windows库文件静态导入API调用的默认方式。...通过使用此方法,AV / EDR系统可以修补Windows库文件(如NTDLL.dll)的内存副本 与P / Invoke相比,D / Invoke在运行时手动加载Windows API函数,并使用指向其在内存中位置的指针来调用该函数...最初,我计划展示如何P / Invoke CreateRemoteThread C#shellcode注入PoC移植到D / Invoke Syscall版本中。

7.7K31

C#图解教程第一章 C#和.NET框架

1.1 在.NET之前  C#发音:see shap  1.1.1 20世纪90年代后期的Windows编程   20世纪90年代后期各语言缺点:    1.纯Win32 API不是面向对象的,而且工作量比...内存管理     代码安全验证     代码执行     垃圾收集    编程工具涵盖了编码和调试需要的一起,包括:     Visual Studio集成开发环境     .NET兼容的编译器(例如:C#...(platfrom invake,P/Invoke)     允许调用并使用非.NET的,但通过Win32 DLL导出的纯C函数的代码(比如Windows API)    允许与COM的互操作     ...  CLR执行步骤:    检查程序集的安全特性    在内存中分配空间    可执行代码发送给实时编译器,把其中一部分编译成本机代码   不被调用的代码不会被编译成本机代码,被调用的代码只被编译一次...  CIL-->本机代码 CLR在它运行时进行管理(释放无主内存,检查数组边界,检查参数类型和管理异常等)    术语:     托管代码:      为.NET框架编写的代码      需要CLR

1.2K110

.NET周报 【7月第1期 2023-07-02】

[MAUI]用纯C#代码写两个漂亮的时钟 https://www.cnblogs.com/jevonsflash/p/17519792.html 本文介绍了如何在.NET MAU中实现Material...Docker 中的 .NET 异常了怎么抓 Dump https://www.cnblogs.com/huangxincheng/p/17505313.html 有很多朋友跟我说,在 Windows 上看过你文章知道了怎么抓...DUMP的分析旅程中,跑在 Docker 中的 .NET 占比真的不多,大概10个dump有 1-2 个是 docker 中的,市场决定了我的研究方向,为了弥补这一块的空洞,决定写一篇文章来分享下这三大异常下的捕获吧...这提供了诸如聊天式帮助、提交消息生成和文件生成等功能。...【日文】模块初始值设定项的调用顺序 https://ufcpp.net/blog/2023/6/init-order/ 存在多个模块初始值设定项(“ModuleInitializer”)执行顺序的描述

15020

invoke和begininvoke 区别——c#

设置为false表示不对错误线程的调用进行捕获。这样在线程中对textbox的Text属性进行设置就不会再报错了。 其次,通过delegate的方法来解决。...有些api发送消息需要一个窗口句柄,这种函数可以把消息发送到指定窗口的主线程消息队列;而有些则可以直接通过线程句柄,把消息发送到该线程消息队列中。 ?...这个方法是个阻塞方法,也就是操作系统会确保消息的确发送到目的消息队列,并且该消息被处理完毕以后,该函数才返回。返回之前,调用者将会被暂时阻塞。...PostMessage也是一个用来发送消息到窗口消息队列的api函数,但这个方法是非阻塞的。也就是它会马上返回,而不管消息是否真的发送到目的地,也就是调用者不会被阻塞。...例如,我们调用窗体上一个进度条的Invoke方法封送委托,但是实际上会回溯到主窗体,通过这个控件对象来封送委托。因为主窗体是主线程消息队列相关的,发送给主窗体的消息才能发送到界面主线程消息队列。

2.4K41

【深入浅出C#】章节 6: 异常处理和调试:异常的概念和处理机制

C#中的异常类继承结构如下: System.Exception:是所有异常类的基类,它包含了异常的基本信息,如消息、堆栈跟踪等。...", nameof(value)); } // 其他计算逻辑 } 在调用Calculate方法,如果传入的value小于等于零,就会抛出ArgumentException异常,并且异常消息中会显示...System.NotSupportedException: 表示不支持的操作异常,当调用不支持的方法或功能抛出。 除了以上列举的基本异常类型,C# 中还有很多其他异常类型可供捕获。...在 Main() 方法中,我们捕获了这个外部异常,并使用 InnerException 属性获取了内部异常的信息。输出将显示外部异常消息、类型以及内部异常消息和类型。...这在处理多个异常层级或在捕获外部异常包装内部异常非常有用。

71340

【答疑解惑第十二讲】windows编程学习框架图

,那么Win32相关API始终都是最后的那个调用。...因此在下要学习窗口程序编写,一定离不开 API的使用,由于C#、VB已经把窗口程序作为其必备的部分,也就不再考虑这个问题,我们今天的目标就是带领广大初学者如何用C/C++来学习编写下的窗口程序,已经熟悉的或者高手们直接略过...+语言的学习资料和方法网上到处都有,教程也是多如牛毛,各有各的理解和喜好,至于什么书好,自己去查,我也不想在这里被拍砖,但至少C/C++语言常用语法和知识点都应该知道,能用C语言编写一些基本程序,知道如何调用第三方的...Win32编程是最“原始”的编程模式,只要有C语言基础就可以,这种编程模式就是采用C语言+ API调用的方式,MFC那些类封装的成员函数,最后也都是调用了的API接口。...异常处理——包括结构化异常处理、异常链、错误与恢复。 本文共 1839 个字数,平均阅读时长 ≈ 5分钟

46020
领券