如何获取弹出窗口的句柄
最简单方法就是用FindWindows这个API了,你先用SPY++看看这个窗口的classname和caption,然后把它们作为FindWindows的参数
现在我想对该弹出式窗口模拟一次回车按键信息,能告诉我怎么弄吗?
很简单,用SendMessage就可以了。
LRESULT SendMessage( HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
hWnd:窗口句柄
Msg:可以用WM_KEYDOWN,表示发送按键消息
wParam:VK_RETURN,表示回车键
lParam:用不着,置0就行
如何得到句柄,窗口句柄
LPCTSTR IpClassName 是窗口的类名,每一个窗口类型都有一个类名,有很多窗口时同一种类型的窗口,所以他们的类名都是一样的
LPCTSTR IpWindowName 是窗口的标题,就是一般任务栏上的文字。
有些窗口没有显示窗口标题
例如找到任务管理器窗口句柄的语句应该是:
HWND hwnd = ::FindWindowW(L"#32770",L"Windows 任务管理器");
如何通过进程名获取窗口句柄?
.版本 2.支持库 shellEx.程序集 窗口程序集1.程序集变量 HOME, 整数型.程序集变量 句柄, 整数型.子程序 __启动窗口_创建完毕HOME = 注册热键 (_启动窗口.取窗口句柄 (), 标签1.取窗口句柄 (), 0, #Home键).子程序 _标签1_反馈事件, 整数型.参数 参数一, 整数型.参数 参数二, 整数型.判断开始 (参数一 = HOME) 句柄 = WindowFromPoint (取鼠标水平位置 (), 取鼠标垂直位置 ()) 编辑框1.内容 = 到文本 (句柄).版本 2.DLL命令 WindowFromPoint, 整数型, "user32.dll", "WindowFromPoint" .参数 xPoint, 整数型 .参数 yPoint, 整数型按HOME键可以取出鼠标处窗口的句柄
获取窗口句柄
//这个可以
HWND hwnd;
if(hwnd=::FindWindow(NULL,"QQ2009"))//"TXGuiFoundation",NULL
{
::MoveWindow(hwnd,0,0,200,800,TRUE);
}
我想问下 我获取了窗口句柄 这个有什么用呢 然后我怎么用这个窗口句柄做一些事情呢
在Windows中,句柄是一个系统内部数据结构的引用。
例如当你操作一个窗口,系统会给你一个该窗口的句柄,系统会通知你:你正在操作142号窗口,就此你的应用程序就能要求系统对142号窗口进行操作——移动窗口、改变窗口大小、把窗口极小化为图标等。
实际上许多Windows API函数把句柄作为它的第一个参数,如GDI(图形设备接口)句柄、菜单句柄、实例句柄、位图句柄等,不仅仅局限于窗口函数。
换句话说,句柄是一种内部代码,通过它能引用受系统控制的特殊元素,如窗口、位图、图标、内存块、光标、字体、菜单等。
为什么我们需要句柄? 更准确地说,是windows需要句柄。
windows需要向程序员提供必要地编程接口 ,在这些接口中,允许程序员访问、创建和销毁对象。
但是,出于封装地考虑,wi ndows并不想向程序员返回指针。
指针包含了太多的信息。
首先指针给出了对象存储 的确切位置;其次,要操作一个指针,程序员必须知道指针所指对象的内部结构特 征,也即,windows必须向程序员暴露相应的数据结构,而这些数据结构也许是操作 系统想向程序员隐藏的。
如果说COM技术向用户隐藏了数据,只暴露了接口并只允许按接口定义的方法操 作数据的话,句柄这种方式则允许你按自己的方式直接操作数据,但windows又不向 你直接暴露数据。
直接操作数据是程序员需要的,不暴露数据是windows所需要的, 句柄封装方式实现了各取所需
怎样获取当前窗口句柄?
[DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
/// <summary>
/// 获取有名字窗体句柄
/// </summary>
/// <param name="caption">窗体名</param>
/// <param name="delay">循环查询次数</param>
/// <param name="maxTries">停顿时间</param>
/// <returns>句柄 IntPtr</returns>
static IntPtr FindMainWindowHandle(String caption,int delay,int maxTries)
{
IntPtr mwh = IntPtr.Zero;
bool foundWindow = false;
int attempts = 0;
do
{
mwh = FindWindow(null, caption);
if (mwh == IntPtr.Zero)
{
Console.WriteLine("Form not yet found
");
Thread.Sleep(maxTries);
++attempts;
}
else
{
Console.WriteLine("Form has been found");
foundWindow = true;
}
}
while(!foundWindow && attempts<delay);
if(mwh != IntPtr.Zero)
return mwh;
else
throw new Exception("Coule not find Main Window");
//调用FindMainWindowHandle()方法以获取窗体句柄,例:
IntPtr wHandle= FindMainWindowHandle("窗体名",10,100);
Console.WriteLine("窗体句柄: " + wHandle);