查找窗口句柄

阅读: 评论:0

2024年2月8日发(作者:)

查找窗口句柄

查找窗口句柄 - FindWindow

2009-04-20 18:55

声明:

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA"

(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

此函数的作用是寻找窗口列表中第一个符合指定条件的顶级窗口,获得句柄后,可用api函数GetWindowText取得这个窗口的标题。

返回值 Long,得到找到窗口的句柄。如未找到相符窗口,则返回零。

参数说明:

第一个参数lpClassName为类名,或设为零,表示接收任何类

第二个参数lpWindowName为包含的标题文本,或设为零,表示接收任何窗口标题

一般很少要求同时按类与窗口名搜索,我们可传递vbNullString常数。如果想列举出系统所有的窗口句柄时,可以使用循环,并将两个参数都设为vbNullString

比如查找标题为“我的电脑”的窗口:

Dim sHwnd As Long

sHwnd = FindWindow(vbNullString, "我的电脑")

成功则返回标题为“我的电脑”的窗口句柄,否则返回0

真有意思 []

C#用 SendKyes 结合 Process 或 API FindWindow、SendMessage(PostMessage) 等控制外部程序

2008年10月28日

首页,要说明几个概念:

Win32 平台是 消息驱动模式

.Net 框架是 事件驱动模式

标题所指的 “控制外部程序”,外部程序是指与本程序无内在相关性的另外一个程序

基于上面提到的,对于.NET的winform程序,在默认情况下(即未对接收消息的事件做自定义处理,说白了:就是没有 重写/覆写(override)窗体(Form)的DefWndProc 事件),.Net 的 winform 程序,是不响应所接收到的自定义消息的。

我们这里要讨论的内容,就分为两种情况:

1. C#/.NET的程序,控制外部的 win32程序(win16不做考虑)

2. C#/.NET的程序,控制外部的 .NET程序

从标题,大家也看到, C# 对外部程序的控制, 我们也分为两种情况来讨论:

1. .NET 平台自带的 SendKeys 和 Process 结合的方式

2. 完全利用 Windows API 的消息机制 的方式

一、.NET平台自带的 Process 和 SendKeys 结合的方式

本例子,用 C# 的一个Winform程序,创建一个指定路径的文本文件,写入某些内容后,并保存。

为了看清效果,将 Form 的 TopMost 设为 true

private void button1_Click( object sender, EventArgs e )

{

//启动 记事本程序,并在d:下创建 或 打开

text_文件

s txt =

( @"",

@"d:text_" );

Style = ;

//等待一秒,以便目标程序输入状态就绪

rInputIdle ( 1000 );

//如果目标程序 没有停止响应,则继续

if ( ding )

{

//开始写入内容

it ( "-----下面的内容是外部程序自动写入-----rn" );

it ( ); //将文本框内的内容写入

it ( "{Enter}{Enter}" ); //写入2个回车

it ( "文档创建时间:" );

it ( "{F5}" ); //发送F5按键

it ("{Enter}"); //发送回车键

it ( "^s" ); //发送 Ctrl + s 键

it ( "%{F4}" ); // 发送 Alt + F4 键

("文件已经保存成功!");

}

}

注: SendKeys 发送的按键的接收窗体,必须是当前的活动窗体

二、C# 利用 Windows API 控制 外部的 win32 程序

我们这里,用控制 “计算器”程序,算一个 3 + 2 = 5 的算式来做示例。

API 中我们要用到的函数有 FindWindow, FindWindowEx, SendMessage,

SetForegroundWindow

对于API的引用方法,大家去看 API 手册,我这里提供一个VB自带的API查询程序

要使用API,需要引入命名空间

using pServices;

下面的API引用部分的代码,放入 class 内部

[DllImport ( "", EntryPoint = "FindWindow", SetLastError =

true )]

private static extern IntPtr FindWindow( string lpClassName, string

lpWindowName );

[DllImport ( "", EntryPoint = "FindWindowEx", SetLastError =

true )]

private static extern IntPtr FindWindowEx( IntPtr hwndParent, uint

hwndChildAfter, string lpszClass, string lpszWindow );

[DllImport ( "", EntryPoint = "SendMessage", SetLastError =

true, CharSet = )]

private static extern int SendMessage( IntPtr hwnd, uint wMsg, int wParam,

int lParam );

[DllImport ( "", EntryPoint = "SetForegroundWindow",

SetLastError = true )]

private static extern void SetForegroundWindow( IntPtr hwnd );

private void button1_Click( object sender, EventArgs e )

{

const uint BM_CLICK = 0xF5; //鼠标点击的消息,对于各种消息的数值,大家还是得去API手册

IntPtr hwndCalc = FindWindow ( null, "计算器" ); //查找计算器的句柄

if ( hwndCalc != )

{

IntPtr hwndThree = FindWindowEx ( hwndCalc, 0, null, "3" ); //获取按钮3 的句柄

IntPtr hwndPlus = FindWindowEx ( hwndCalc, 0, null, "+" ); //获取按钮 + 的句柄

IntPtr hwndTwo = FindWindowEx ( hwndCalc, 0, null, "2" ); //获取按钮2 的句柄

IntPtr hwndEqual = FindWindowEx ( hwndCalc, 0, null, "=" ); //获取按钮= 的句柄

SetForegroundWindow ( hwndCalc ); //将计算器设为当前活动窗口

( 2000 ); //暂停2秒让你看到效果

SendMessage ( hwndThree, BM_CLICK, 0, 0 );

( 2000 ); //暂停2秒让你看到效果

SendMessage ( hwndPlus, BM_CLICK, 0, 0 );

( 2000 ); //暂停2秒让你看到效果

SendMessage ( hwndTwo, BM_CLICK, 0, 0 );

( 2000 ); //暂停2秒让你看到效果

SendMessage ( hwndEqual, BM_CLICK, 0, 0 );

( 2000 );

("你看到结果了吗?");

}

else

{

("没有启动 [计算器]");

}

}

查找窗口句柄

本文发布于:2024-02-08 12:15:40,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170736574067440.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:句柄   程序   消息
留言与评论(共有 0 条评论)
   
验证码:
排行榜

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23