技术心得记录:控制台——对窗口句柄的操作

简介: 技术心得记录:控制台——对窗口句柄的操作

窗口句柄的含义:在Windows中,句柄是一个系统内部数据结构的引用。例如当//代码效果参考:http://www.lyjsj.net.cn/wz/art_23663.html

你操作一个窗口,或说是一个Delphi窗体时,系统会给你一个该窗口的句柄,系统会通知你:你正在操作142号窗口,就此你的应用程序就能要求系统对142号窗口进行操作——移动窗口、改变窗口大小、把窗口最小化等等。实际上许多Windows API函数把句柄作为它的第一个参数,如GDI(图形设备接口)句柄、菜单句柄、实例句柄、位图句柄等,不仅仅局限于窗口函数。换句话说,句柄是一种内部代码,通过它能引用受系统控制的特殊元素,如窗口、位图、图标、内存块、光标、字体、菜单等。

窗口句柄是什么:在windows中,句柄是和对象一一对应的32位无符号整数值。对象可以映射到唯一的句柄,句柄也可以映射到唯一的对象。


为什么我们需要句柄:更准确地说,是windows需要句柄。windows需要向程序员提供必要的编程接口,在这些接口中,允许程序员访问、创建和销毁对象。但是,出于封装地考虑,windows并不想向程序员返回指针。指针包含了太多的信息。首先指针给出了对象存储的确切位置;其次,要操作一个指针,程序员必须知道指针所指对象的内部结构特征,也即,windows必须向程序员暴露相应的数据结构,而这些数据结构也许是操作系统想向程序员隐藏的。如果说COM技术向用户隐藏了数据,只暴露了接口并只允许按接口定义的方法操作数据的话,句柄这种方式则允许你按自己的方式直接操作数据,但windows又不向你直接暴露数据。直接操作数据是程序员需要的,不暴露数据是windows所需要的,句柄封装方式实现了各取所需


句柄如何与对象映射:封装背后,必须有一个地方可以实现解码,以实现句柄和对象的相互转换。在windows中,存在两种映射方式:a. 全等映射。也即,句柄本身就是一个指针。映射在这里只是类型转换而已。这种情况有,进程实例句柄或模块句柄,以及资源句柄等等。b. 基于表格的映射。这是对象指针与句柄之间最普通的映射机制。操作系统创建表格,并保存所有要考虑的对象。需要创建新对象时,要先在表格中找到空入口,然后把表示对象的数据添入其中。当对象被删除时,它的数据成员和其在表中的入口被释放。


窗口句柄的实际操作:我们可以设置控制台窗体的大小,下面是核心代码


1 【DllImport("User32.dll", EntryPoint = "FindWindow")】 //找到窗体


2 private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);


3 【DllImport("user32.dll", EntryPoint = "FindWindowEx")】 //找子窗体


4 private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);


5 【DllImport("User32.dll", EntryPoint = "SendMessage")】 //用于发送信息给窗体


6 private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);


7 【DllImport("User32.dll", EntryPoint = "ShowWindow")】 //窗体展示的设置


8 private static extern bool ShowWindow(IntPtr hWnd, int type);


1 public static void SetForm()


2 {


3 IntPtr ParenthWnd = new IntPtr(0);


4 IntPtr et = new IntPtr(0);


5 ParenthWnd = FindWindow(null, "FirstExe");


6 ShowWindow(ParenthWnd, 3);// 0: 后台执行;1:正常启动;2:最小化到任务栏;3:最大化


7 Thread.Sleep(3000);


8 Console.Write("Exit");


9 }


控制台程序函数主入口进行方法的调用


1 static void Main(string【】 args)


2 {


3 Console.Title = "FirstExe";


4 SetForm();


5 }

相关文章
|
1月前
|
Java 数据库 数据安全/隐私保护
基于JavaSE+JDBC使用控制台操作的简易购物系统【源码+数据库】
基于JavaSE+JDBC使用控制台操作的简易购物系统【源码+数据库】
|
19天前
|
NoSQL 数据管理 关系型数据库
数据管理DMS操作报错合集之控制台查看Redis时出现乱码是什么导致的
数据管理DMS(Data Management Service)是阿里云提供的数据库管理和运维服务,它支持多种数据库类型,包括RDS、PolarDB、MongoDB等。在使用DMS进行数据库操作时,可能会遇到各种报错情况。以下是一些常见的DMS操作报错及其可能的原因与解决措施的合集。
|
12天前
|
Oracle 关系型数据库 MySQL
实时计算 Flink版操作报错合集之遇到控制台报错:onnected to the target VM, address: '127.0.0.1:56821', transport: 'socket',是什么导致的
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
10月前
|
C语言
用c语言输出有颜色的字体 printf输出 控制台程序修改文本位置 设置控制台程序窗口标题
用c语言输出有颜色的字体 printf输出 控制台程序修改文本位置 设置控制台程序窗口标题
|
7月前
Intellij IDEA 中的 Debug 控制台输出窗口消失
Intellij IDEA 中的 Debug 控制台输出窗口消失
117 0
|
9月前
|
Linux 开发工具 数据安全/隐私保护
Linux基础操作2(常用基础命令,控制台操作)
Linux基础操作2(常用基础命令,控制台操作)
68 0
Linux基础操作2(常用基础命令,控制台操作)
|
10月前
|
C语言 C++ Windows
【c++】设置控制台窗口字体颜色和背景色(system和SetConsoleTextAttribute函数 )(内含超好玩的c++游戏链接)
【c++】设置控制台窗口字体颜色和背景色(system和SetConsoleTextAttribute函数 )(内含超好玩的c++游戏链接)
368 0
【c++】设置控制台窗口字体颜色和背景色(system和SetConsoleTextAttribute函数 )(内含超好玩的c++游戏链接)
|
Python
Python 控制台操作的文字版“数独”游戏(非GUI版本)
Python 控制台操作的文字版“数独”游戏(非GUI版本)
175 0
|
C++
C++ 控制台窗口中MessageBox() 的用法
C++ 控制台窗口中MessageBox() 的用法
198 0
|
C++
C++ 设置控制台文本属性画一个DOS时代的字符窗口
C++ 设置控制台文本属性画一个DOS时代的字符窗口
61 0