CWindow(窗口 API 函数的包装类)+ IuSpy






4.86/5 (20投票s)
CWindow(窗口 API 函数的包装类) + IuSpy(Spy++ 类似工具)。
引言
在 .NET 中,有一些用于处理窗口(其他应用程序的窗口)的函数。大部分函数出现在 .NET 3.0 中,但它们还不够。因此,我们不得不使用 WinAPI 函数。在这里,我介绍了 CWindow
类,它是对所需窗口 API 函数的包装类。
关于
我决定让 CWindow
的外观类似于 System.Windows.Forms.Form
.NET 类。因此,大多数 函数/属性的描述与 Form
类中同名函数/属性的描述相似。有时,甚至内部构造也相同。
在本文中,我不会描述所有函数/属性,只描述那些与 Form
.NET 类中的函数/属性有足够差异的。其他函数的描述可以从 CWindow
代码或 MSDN 中获取。代码的注释足够详细,并且本文中的大多数描述只是对类代码中函数进行的简短描述,并附有解释。我决定在 CWindow
中完全不抛出异常,因为错误可能非常具体,最好在主代码中捕获它们。
IuSpy 程序最初只是作为使用 CWindow
类的一个示例。但是,在获得一个可用的应用程序后,我决定对其进行完善,使其更易于使用。所以请记住,IuSpy 不是最终产品。您可以看到一些 CWindow
函数/属性的工作方式,但不要认为这是最好的方法。例如,在 TreeForm
和 FindWindowForm
中,我枚举了所有窗口,但在 TreeForm
中,我做得比较慢。这只是一个示例。IuSpy 是一个非常简单的程序。几乎所有控件都有工具提示。因此,我不会在本文中对其进行描述。您可以在此页面顶部看到它的图片。
CWindow 类
静态函数/属性
属性
TopWindow
- 获取/设置窗口 Z 顺序中的顶级窗口。StateChangeAnimation
- 获取/设置最小化和最大化时窗口动画是否启用。ActiveWindow
- 获取/设置当前活动的窗口。FocusedWindow
- 获取/设置具有键盘焦点的窗口。Captured
- 获取(如果有)捕获了鼠标的窗口。DesktopWindow
- 获取桌面窗口。
函数
FromPoint
- 检索指定位置的窗口。FindWindow
- 重载。检索类名和窗口名与指定值匹配的窗口。EnumWindows
- 枚举屏幕上的所有顶级窗口。有关详细信息,请参阅 MSDN 中的EnumWindows
,或代码中的描述。EnumThreadWindows
- 枚举与指定线程关联的所有非子窗口。有关详细信息,请参阅 MSDN 中的EnumThreadWindows
,或代码中的描述。GetThreadWindows
- 检索指定线程中包含的顶级窗口集合。
类对象
CWindow
对象只是一个 IntPtr
- 窗口的句柄。
隐式运算符
CWindow
-> IntPtr
;IntPtr
-> CWindow
;CWindow
-> int
;
重载运算符
==/!= (CWindow
, CWindow
), ==/!= (CWindow
, IntPtr
)。所以你可以这样使用
IntPtr p;
CWindow w,w2;
w = new CWindow(p);
w = p;
p = w;
w = 0x15864;
if(w == w2)…
if(w != p)…
窗口信息
TextUnsafe
- 获取/设置与此窗口关联的文本。简单的Text
属性无法获取/设置大多数窗口类型的文本。TextUnsafe
向指定窗口发送消息,如果该窗口无响应,则您的应用程序可能会挂起。使用此属性之前,请检查IsHung
。Exists
- 确定此对象是否标识现有窗口。Menu
- 获取/设置分配给窗口的菜单的句柄。ThreadId
- 获取创建此窗口的线程的标识符。ProcessId
- 获取创建窗口的进程的标识符。IsUnicodeWindow
- 确定指定窗口是否为本地 Unicode 窗口。IsHung
- 确定 Microsoft Windows 是否认为指定应用程序没有响应。ClassName
- 获取指定窗口所属类的名称。RealClassName
- 获取指定窗口类型的字符串。
您可以使用以下属性获取图标
图标
SmallIcon
ClassIcon
SmallClassIcon
使用这些属性时要小心,请先检查 IsHung
。如果您想设置自己的图标,则需要将其写入窗口所属进程的内存空间。您可以使用 WriteProcessMemory()
来实现。但不要忘记,您还需要销毁旧图标。您必须从窗口进程的空间调用 DestroyIcon()
。对于这些操作,您需要使用钩子注入您的 Win32 DLL。我使用我的一些其他类来实现此目的,并决定不将它们全部放在一起。
样式
样式
UpdateStyles()
GetStyle()
SetStyle()
您可以使用 GetStyle()
获取窗口样式,并使用 SetStyle()
进行设置。如果您需要多次获取或设置同一个窗口的样式,您可以使用 Styles
属性以及它返回的 WindowStyle
类的对象。不要忘记,您不仅需要为窗口设置样式,还需要应用它们。您可以使用 UpdateStyles()
来实现,或者在 SetStyle()
函数中指定。
扩展样式
ExStyles
UpdateExStyles()
GetExStyle()
SetExStyle()
描述与简单样式相同。
状态
属性
WindowState
- 获取/设置窗口的状态。WindowVisibleState
- 获取/设置窗口的可见状态。实现方式与Form.WindowState
相同。有时与真实的窗口状态不同。要更改真实的当前状态,请使用WindowState
。RestoreToMaximized
- 获取/设置一个值,指示窗口在恢复状态时是否最大化。
函数
Minimize
- 最小化窗口。Restore
- 将窗口从最小化状态恢复到其之前的状态。
窗口关系
属性
Children
- 获取窗口中包含的窗口集合。它只包含直接的子窗口。IsTopWindow
- 如果当前窗口是顶级窗口,则检查它是否在 Z 顺序的顶部。如果窗口是子窗口,则检查它是否在其父窗口的 Z 顺序的顶部。ThreadWindows
- 获取窗口所在线程中包含的顶级窗口的集合。TopChild
- 如果此窗口是父窗口,则获取 Z 顺序顶部的子窗口;否则,返回空窗口。TopLevelWindow
- 通过遍历父窗口链来检索根窗口。
函数
EnumChildWindows
- 枚举属于此窗口的子窗口。EnumThreadWindows
- 枚举与当前线程关联的所有非子窗口。FindChildWindow
- 重载。检索类名和窗口名与指定值匹配的窗口。GetNextWindow
- 检索与此窗口具有指定关系(Z 顺序或所有者)的窗口。InsertAfter
- 在 Z 顺序中将此窗口插入到指定窗口之后。
其他
Transparent
- 获取/设置窗口是否被视为透明。可用于命中测试或绘制底层窗口。ForceActivate()
- 激活窗口并使其获得焦点。Activate()
函数在某些情况下无法激活窗口,例如,当显示弹出窗口时。因此,如果您想在任何情况下都激活窗口,可以使用ForceActivate
() 函数。
同名属性/函数
以下属性/函数的描述可以在类代码或 MSDN 中找到。请记住,它们的实际描述可能不会完全重复 MSDN 的描述。因此,您可以使用 MSDN 的描述来决定它是否是您需要的函数,然后查看类代码中的规范。
WindowRelations
HasChildren
Owner
Parent
TopLevel
BringToFront()
Contains()
GetChildAtPoint()
SendToBack()
SetTopLevel()
坐标
底部
Bounds
ClientRectangle
ClientSize
DesktopBounds
DesktopLocation
高度
左侧
Location
MaximizedBounds
MaximumSize
MinimumSize
RestoreBounds
右侧
大小
顶部
宽度
PointToClient()
PointToScreen()
RectangleToClient()
RectangleToScreen()
Visibility
AllowTransparency
Opacity
区域
TransparencyKey
Visible
Hide()
Invalidate()
Refresh()
Show()
Update()
窗口信息
句柄
文本
Enabled
Modal
CanFocus
Focused
ContainsFocus
捕捉
ShowInTaskbar (在任务栏中显示)
其他
Activate()
Close()
CreateGraphics()
Focus()
其他类
CWindowWorker, CWindowsWorker
这些类没有做得很复杂。它们只包含基本功能,您可以使用它们来实现所需的一切。
CWindowWorker
如果您想在单个屏幕刷新周期内更改窗口的多个属性,可以使用 CWindowWorker
类。构造函数很简单。只需将 CWindow
对象或窗口句柄放在那里。使用此类,您可以更改窗口的 Location
、Size
和 Visible
状态,设置样式和扩展样式,还可以设置窗口顺序。
您可以使用 SetStyle()
或 SetExStyle()
设置窗口样式,但在调用 Reposition()
函数时,它们将被应用于窗口。
重载的 SetOrder()
更改窗口在 Z 顺序中的位置。但是,请记住,对于当前的重新定位,您只能使用此函数一次。这是 Iu.Windows
命名空间中唯一一个如果当前对象被调用超过一次则会抛出异常的函数,因为这是一个明显的开发者错误。
在最后调用 RePosition()
来应用您指定的所有内容。
CWindowsWorker
当您想在单个屏幕刷新周期内更改多个窗口的属性时,请使用此类。此类只有一个索引器和 Reposition()
函数。
您可以在索引器中指定 CWindow
对象或句柄,然后您将获得指定窗口的 CWindowWorker
类对象。您可以在返回的对象中指定任何您想要的内容,但不要调用 Reposition()
。
最后,在更改完所有窗口后,调用 CWindowsWorker
类的 Reposition()
函数来应用所有更改。
WindowStyle, WindowExStyle
CWindow
类的 Styles
和 ExStyles
属性返回上述类的对象。它们用于检查/设置指定的样式。当您需要多次检查/设置同一个窗口的样式时,它们非常有用。这两个类都有 Check()
和 Set()
函数以及许多隐式运算符。