gpt4 book ai didi

c# - 获取屏幕边缘和网页之间的距离

转载 作者:行者123 更新时间:2023-11-30 12:26:55 24 4
gpt4 key购买 nike

enter image description here

好的,考虑这张图片。

I develop an IE extension in c# and I would :
- the distance in red, between top of screen and top of `visible webpage`
- the distance in red between left of screen and left of `visible webpage`
- the width/heigth of the visible webpage

当然考虑到我有整个屏幕尺寸。如果我有红色和黑色,我可以计算出绿色。

有什么意义?

我有千个屏幕坐标(X,Y),我必须计算相对于网页的坐标。

Example : 

Considering
Screen size : 1200 * 800
Webpage size : 400*300
Red distance between left screen border and left webpage border : 200
Red distance between top screen border and top webpage border : 300

So my coordinates screen => relative webpage becomes :
( 100, 100 ) => OUTSIDE WEBPAGE( ignored )
( 1100, 650 ) => OUTSIDE WEBPAGE ( ignored )
( 200, 300 ) => ( 0,0 )
( 250, 400 ) => ( 50, 100 )

实际上我有这段代码,this继承自AddinExpress.IE.ADXIEModule,thetoolbarObj是我添加到InternetExplorer的工具栏。所以我可以在上面使用 pointToScreen,我离我需要的不远,但是工具栏的左上角不是我需要的,我需要网页的左上角。

public void getUtilsDimension()
{
Rectangle resolution = Screen.PrimaryScreen.Bounds;
Int32 screenWidth = resolution.Width;
Int32 screenHeight = resolution.Height;

AddinExpress.IE.ADXIEToolBarItem toolbarItem = this.ToolBars[0];
AddinExpress.IE.ADXIEToolbar toolbarObj = toolbarItem.ToolBarObj;
Point leftCornerWebPage = toolbarObj.PointToScreen(new Point(0, 0));
Int32 toolbarHeight = toolbarObj.Height;
Int32 toolbarWidth = toolbarObj.Width;

Debug.WriteLine("Largeur écran : " + screenWidth);
Debug.WriteLine("Hauteur écran : " + screenHeight);
Debug.WriteLine("LeftCornerX : " + leftCornerWebPage.X);
Debug.WriteLine("LeftCornerY : " + leftCornerWebPage.Y);
Debug.WriteLine("toolbarHeight : " + toolbarHeight);
Debug.WriteLine("toolbarWidth : " + toolbarWidth);

}

这是我实际得到的,屏幕是 1600*900,po​​intToScreen 返回红叉的坐标( 484,158 )。但是我需要蓝色十字的坐标,作为可见网页的宽度和高度。我知道我可以在 Jquery 中使用 $(window) 获得它,但我不知道如何使用 C#。

我可以使用 this.HTMLDocument 访问 HTLMDocument(typeof mshtml.HTMLDocument),不幸的是 pointToScreen 在 HTMLDocument 对象上不可用。

enter image description here

编辑:第一个屏幕截图上是 chrome,但当然应该是 IE

08/12 更新

好的,我有可见网页的宽度和高度(屏幕截图上的黑线)唯一缺少的是我截图2上蓝色十字的坐标

var heightVisibleWebPage = HTMLDocument.documentElement.offsetHeight;
var widthVisibleWebPage = HTMLDocument.documentElement.offsetWidth;

为了赏金,我需要蓝十字的精确坐标。不管怎样。无论 Internet Explorer 版本、收藏夹/工具/命令/状态栏是否显示,它都应该工作。

更新 08/12 HTMLDocument

HTMLDocument 来自 AddinExpress,它不是 System.Windows.Forms.HtmlDocument

public mshtml.HTMLDocument HTMLDocument
{
get
{
return (this.HTMLDocumentObj as mshtml.HTMLDocument);
}

}

他的父 HTMLDocument.parentWindows 是一个 IHTMLWindow2对象

HTMLDocumentObj 是

的成员
public class ADXIEModule : Component, IRemoteModule2, IRemoteModule, IObjectWithSite, IWin32Window
{
...
//
// Résumé :
// Gets the automation object (a COM object) of the active document, if any.
//
// Notes :
// When the active document is an HTML page, this property provides access to
// the contents of the HTML Document Object Model (DOM). Specifically, it returns
// an HTMLDocument object reference. The HTMLDocument object is functionally
// equivalent to the HTML document object used in HTML page script. It supports
// all the properties and methods necessary to access the entire contents of
// the active HTML document.
// The HTMLDocument object can be used through the IHTMLDocument interface,
// the IHTMLDocument2 interface, and the IHTMLDocument3 interface.
// When other document types are active, such as a Microsoft Word document,
// this property returns the document automation object of that document. For
// Word documents, this is the Document object.
[Browsable(false)]
public object HTMLDocumentObj { get; }

...

请为社区解释什么时候为 -1 ;)

最佳答案

这些是步骤:

  1. 使用 EnumWindows() api 查找 Internet Explorer 窗口句柄。类名是IEFrame

  2. 使用 EnumChildWindows() api 遍历所有子窗口。类名为 Internet Explorer_Server

  3. 使用 GetWindowRect() api 查找 x, y 坐标

代码:

[DllImport("user32.dll")]
public static extern int EnumWindows(EnumWindowsCallback lpEnumFunc, int lParam);

[DllImport("user32.dll")]
public static extern int EnumChildWindows(IntPtr hWndParent, EnumWindowsCallback lpEnumFunc, int lParam);

public delegate bool EnumWindowsCallback(IntPtr hwnd, int lParam);

[DllImport("user32.dll")]
public static extern void GetClassName(IntPtr hwnd, StringBuilder s, int nMaxCount);

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left; // x position of upper-left corner
public int Top; // y position of upper-left corner
public int Right; // x position of lower-right corner
public int Bottom; // y position of lower-right corner
}

[DllImport("user32.dll")]
static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);

private IntPtr ieHandle, ieChildHandle;

private void GetWindows()
{
EnumWindows(Callback, 0);
}

private bool Callback(IntPtr hwnd, int lParam)
{
StringBuilder className = new StringBuilder(256);

GetClassName(hwnd, className, className.Capacity);

if (className.ToString().Equals("IEFrame"))
{
ieHandle = hwnd;

return false;
}

return true; //continue enumeration
}

private void GetChildWindows()
{
if (ieHandle != IntPtr.Zero)
{
EnumChildWindows(ieHandle, CallbackChild, 0);
}
}

private bool CallbackChild(IntPtr hwnd, int lParam)
{
StringBuilder className = new StringBuilder(256);

GetClassName(hwnd, className, className.Capacity);

if (className.ToString().Equals("Internet Explorer_Server"))
{
ieChildHandle = hwnd;

return false;
}

return true; //continue enumeration
}

获取坐标:

GetWindows();
GetChildWindows();

if (ieChildHandle != IntPtr.Zero)
{
RECT rect;

if (GetWindowRect(ieChildHandle, out rect))
{
//rect.Left, rect.Top
}

}

ieChildHandle = IntPtr.Zero;
ieHandle = IntPtr.Zero;

已使用 IE 6、9 和 11 进行测试

关于c# - 获取屏幕边缘和网页之间的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27233176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com