C# - 单击用户按钮,获取用户点击的下一个窗口

时间:2012-07-17 02:54:45

标签: c# winforms

这不应该是一个棘手的问题,但是很难对这个问题进行谷歌搜索,并且难以理解。

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

如何在按下按钮后获取下一次用户点击的活动窗口?

由于

2 个答案:

答案 0 :(得分: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上找到了这两个答案中的大部分代码。修改它以适合您的问题

Capture window

Find window width and height

答案 1 :(得分:0)

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

它有一些奇怪的解决方法:

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

    使用的窗体是无边框的,不透明度设置为80%。

  6. Used form

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;

    namespace WindowInfo { public partial class CurrentWindow : Form { Rectangle GDIrect = new Rectangle(0, 0, 100, 100); [DllImport("user32.dll")] public static extern IntPtr WindowFromPoint(Point lpPoint); [DllImport("user32.dll")] public static extern bool GetCursorPos(out Point lpPoint); [DllImport("user32.dll")] private static extern IntPtr GetWindowRect(IntPtr hWnd, ref Rect rect); [DllImport("user32.dll")] static extern IntPtr GetForegroundWindow(); [StructLayout(LayoutKind.Sequential)] public struct Rect { public int Left; public int Top; public int Right; public int Bottom; } public CurrentWindow() { InitializeComponent(); } protected override CreateParams CreateParams { get { CreateParams baseParams = base.CreateParams; baseParams.ExStyle |= (int)( 0x00080000 | 0x08000000 | 0x00000080 | 0x00000020 ); return baseParams; } } public static IntPtr GetWindowUnderCursor() { Point ptCursor = new Point(); GetCursorPos(out ptCursor); return WindowFromPoint(ptCursor); } public Bitmap CaptureScreen() { var result = new Bitmap(this.DisplayRectangle.Width, this.DisplayRectangle.Height); using (var g = Graphics.FromImage(result)) { g.CopyFromScreen(this.Location.X, this.Location.Y, 0, 0, this.DisplayRectangle.Size); } return result; } private void timer1_Tick(object sender, EventArgs e) { IntPtr windowHandle = GetWindowUnderCursor(); Rect rect = new Rect(); 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(); } } } }

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