在做抓图软件,想获取鼠标所在窗口的句柄, 来获得窗体位置和大小来截图,单不知道这些API函数怎么用。

在做抓图软件,想获取鼠标所在窗口的句柄, 来获得窗体位置和大小来截图,单不知道这些API函数怎么用。,第1张

POINT pt;

RECT rt;

GetCursorPos(&pt);//获得当前鼠标位置

HWND hwnd=WindowFromPoint(pt);//获得鼠标所在的窗口句柄

GetWindowRect(hwnd,&rt);//获得窗口矩形

一个网上的例子

c# 获取鼠标处窗口句柄,程序嵌入桌面

using System;

using SystemCollectionsGeneric;

using SystemComponentModel;

using SystemData;

using SystemDrawing;

using SystemText;

using SystemWindowsForms;

using SystemRuntimeInteropServices;

namespace WindowsApplication1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

[DllImport("user32dll", EntryPoint = "FindWindow")]

public static extern int FindWindow(

string lpClassName,

string lpWindowName

);

[DllImport("user32dll", EntryPoint = "GetWindow")]//获取窗体句柄,hwnd为源窗口句柄

/wCmd指定结果窗口与源窗口的关系,它们建立在下述常数基础上:

GW_CHILD

寻找源窗口的第一个子窗口

GW_HWNDFIRST

为一个源子窗口寻找第一个兄弟(同级)窗口,或寻找第一个顶级窗口

GW_HWNDLAST

为一个源子窗口寻找最后一个兄弟(同级)窗口,或寻找最后一个顶级窗口

GW_HWNDNEXT

为源窗口寻找下一个兄弟窗口

GW_HWNDPREV

为源窗口寻找前一个兄弟窗口

GW_OWNER

寻找窗口的所有者

/

public static extern int GetWindow(

int hwnd,

int wCmd

);

[DllImport("user32dll", EntryPoint = "SetParent")]//设置父窗体

public static extern int SetParent(

int hWndChild,

int hWndNewParent

);

[DllImport("user32dll", EntryPoint = "GetCursorPos")]//获取鼠标坐标

public static extern int GetCursorPos(

ref POINTAPI lpPoint

);

[StructLayout(LayoutKindSequential)]//定义与API相兼容结构体,实际上是一种内存转换

public struct POINTAPI

{

public int X;

public int Y;

}

[DllImport("user32dll", EntryPoint = "WindowFromPoint")]//指定坐标处窗体句柄

public static extern int WindowFromPoint(

int xPoint,

int yPoint

);

private void timer1_Tick(object sender, EventArgs e)

{

POINTAPI point = new POINTAPI();//必须用与之相兼容的结构体,类也可以

GetCursorPos(ref point);//获取当前鼠标坐标

int hwnd = WindowFromPoint(pointX, pointY);//获取指定坐标处窗口的句柄

thislabel1Text =pointXToString() + ":" + pointYToString() + "-" + hwndToString();//显示效果,此时窗口已经嵌入桌面了

}

const int GW_CHILD = 5;//定义窗体关系

private void Form1_Load(object sender, EventArgs e)

{

int hDesktop = FindWindow("Progman", null);//获取系统句柄

hDesktop = GetWindow(hDesktop, GW_CHILD);//获取其子窗口句柄,就是桌面的句柄

SetParent((int)thisHandle, hDesktop);//设置父窗体,第一个为要被设置的窗口,第二个参数为指定其父窗口句柄

}

}

}

API:

GetForegroundWindow 可以获取到有焦点的顶层窗口。

获取有焦点的子窗口只能用GetFocus,但是如果当前顶层窗口属于其他线程,GetFocus将返回NULL。没有好的办法解决,除非AttachThreadInput或者用钩子(HOOK)。

以上就是关于在做抓图软件,想获取鼠标所在窗口的句柄, 来获得窗体位置和大小来截图,单不知道这些API函数怎么用。全部的内容,包括:在做抓图软件,想获取鼠标所在窗口的句柄, 来获得窗体位置和大小来截图,单不知道这些API函数怎么用。、C#怎样获得窗口句柄、VB获取窗口下,鼠标光标位置所在的控件句柄等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9612233.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存