1

这不应该是一个困难的问题,但是很难用谷歌搜索这个问题并理解这个想法。

问题很简单:我有一个窗口窗体,用户按下一个按钮,然后,它将等待用户单击另一个窗口。它存储选定的窗口信息以供以后操作(特别是尺寸)。

按下按钮后,如何获取下一个用户单击的活动窗口?

谢谢

4

2 回答 2

1

您需要获取前景窗口。

[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll", SetLastError = true)]
static extern bool GetWindowRect(IntPtr hWnd, out Rectangle lpRect); 


Rect rect = new Rect ();
GetWindowRect(GetForegroundWindow(), out rect);

//calculate width and height from rect

using (Bitmap bitmap = new Bitmap(width, height))
{
    using (Graphics g = Graphics.FromImage(bitmap))
    {
        Size size = new System.Drawing.Size(width, height);
        g.CopyFromScreen(new Point(rect.Left, rect.Top), Point.Empty, size);
    }
    bitmap.Save("C://test.jpg", ImageFormat.Jpeg);
}

[StructLayout(LayoutKind.Sequential)]
public struct Rect {
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}

我在 SO 的这两个答案中找到了大部分代码。修改它以适合您的问题

捕捉窗口

查找窗口宽度和高度

于 2012-07-17T03:46:12.993 回答
0

对您的问题感兴趣,我创建了这个小屏幕捕获应用程序。

它有奇怪的解决方法:

  1. 用于在 winform 外捕获鼠标位置的计时器很奇怪,但比使用Global System Hooks更容易实现。您可以尝试使用链接中的 lib 或自己实现它。您不需要使用 Timer,更重要的是您可以放弃这种不断重新激活表单。
  2. 我在 SE 信息中的某处找到了关于覆盖 CreateParams 的信息,但我再也找不到指向它的链接,它允许您单击槽形式(我认为并非所有添加的参数都是必需的,但正如我所说,我失去了链接 :))。
  3. 仅捕获窗口的可见部分+所有与其重叠的窗口(可能是因为您有一个 windowHandle 到它,您可能会尝试以某种方式显示/激活它)。
  4. 对于某些窗口,它会在窗口内获取控件。
  5. 提供的应用程序可能非常不专业和不安全,可能会炸毁您的计算机,所以要小心;P

    使用的表格是无边界的,不透明度设置为 80%。

用过的形式

使用系统;
使用 System.Collections.Generic;
使用 System.ComponentModel;
使用 System.Data;
使用 System.Drawing;
使用 System.Linq;
使用 System.Text;
使用 System.Windows.Forms;
使用 System.Runtime.InteropServices;

命名空间窗口信息 { 公共部分类 CurrentWindow :表格 { 矩形 GDIrect = new Rectangle(0, 0, 100, 100); [DllImport("user32.dll")] 公共静态外部 IntPtr WindowFromPoint(Point lpPoint); [DllImport("user32.dll")] public static extern bool GetCursorPos(out Point lpPoint); [DllImport("user32.dll")] 私有静态外部 IntPtr GetWindowRect(IntPtr hWnd, ref Rect rect); [DllImport("user32.dll")] 静态外部 IntPtr GetForegroundWindow(); [StructLayout(LayoutKind.Sequential)] 公共结构矩形 { 公共 int 左; 公共int顶部; 公共 int 权利; 公共 int 底部; } 公共当前窗口() { 初始化组件(); } 受保护的覆盖 CreateParams CreateParams { 得到 { CreateParams baseParams = base.CreateParams; baseParams.ExStyle |= (int)( 0x00080000 | 0x08000000 | 0x00000080 | 0x00000020 ); 返回基本参数; } } 公共静态 IntPtr GetWindowUnderCursor() { 点 ptCursor = new Point(); GetCursorPos(out ptCursor); 返回 WindowFromPoint(ptCursor); } 公共位图 CaptureScreen() { var result = new Bitmap(this.DisplayRectangle.Width, this.DisplayRectangle.Height); 使用 (var g = Graphics.FromImage(result)) { g.CopyFromScreen(this.Location.X, this.Location.Y, 0, 0, this.DisplayRectangle.Size); } 返回结果; } private void timer1_Tick(对象发送者,EventArgs e) { IntPtr windowHandle = GetWindowUnderCursor(); 矩形矩形 = 新矩形(); GetWindowRect(windowHandle, ref rect); GDIrect = new Rectangle(rect.Left, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top);

this.Location = new Point(GDIrect.Left, GDIrect.Top); this.Size = GDIrect.Size; this.Activate(); } private void CurrentWindow_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == 'c') { this.Visible = false; Bitmap bmp = CaptureScreen(); bmp.Save(Application.StartupPath + "\\example.png"); this.Visible = true; } else if (e.KeyChar == 'x') { this.Close(); } } } }

你可以将它添加到您的应用程序并在单击按钮后运行,它应该可以工作,但我只单独测试过它。祝你好运 :)。

于 2012-07-17T19:00:55.457 回答