这不应该是一个困难的问题,但是很难用谷歌搜索这个问题并理解这个想法。
问题很简单:我有一个窗口窗体,用户按下一个按钮,然后,它将等待用户单击另一个窗口。它存储选定的窗口信息以供以后操作(特别是尺寸)。
按下按钮后,如何获取下一个用户单击的活动窗口?
谢谢
您需要获取前景窗口。
[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 的这两个答案中找到了大部分代码。修改它以适合您的问题
对您的问题感兴趣,我创建了这个小屏幕捕获应用程序。
它有奇怪的解决方法:
提供的应用程序可能非常不专业和不安全,可能会炸毁您的计算机,所以要小心;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(); } } } }
你可以将它添加到您的应用程序并在单击按钮后运行,它应该可以工作,但我只单独测试过它。祝你好运 :)。