-
Notifications
You must be signed in to change notification settings - Fork 25
/
WindowAttacher.cs
127 lines (111 loc) · 3.73 KB
/
WindowAttacher.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace ja_learner
{
internal class WindowAttacher
{
// 导入 Windows API 函数
[DllImport("user32.dll")]
private static extern bool GetWindowRect(IntPtr hWnd, out Rectangle rect);
[DllImport("user32.dll")]
private static extern bool GetCursorPos(out Point lpPoint);
// 根据鼠标位置获取目标窗口句柄hwnd
[DllImport("user32.dll")]
private static extern IntPtr WindowFromPoint(Point point);
// 根据hwnd获取窗口标题
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int GetWindowText(IntPtr hWnd, StringBuilder title, int size);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int GetWindowTextLength(IntPtr hWnd);
[DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
static extern IntPtr GetParent(IntPtr hWnd);
// 定义 RECT 结构体
[StructLayout(LayoutKind.Sequential)]
public struct Rectangle
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
// 定义 POINT 结构体
[StructLayout(LayoutKind.Sequential)]
public struct Point
{
public int X;
public int Y;
}
private static IntPtr targetHwnd;
public static IntPtr TargetHwnd {
get {
return targetHwnd;
}
set
{
targetHwnd = value;
}
}
public static Rectangle TargetWindowRect
{
get
{
Rectangle rect;
GetWindowRect(targetHwnd, out rect);
return rect;
}
}
public static String GetWindowTitle(IntPtr handle)
{
int length = GetWindowTextLength(handle);
StringBuilder text = new StringBuilder(length + 1);
GetWindowText(handle, text, text.Capacity);
return text.ToString();
}
public static IntPtr GetHwndByCursorPoint()
{
Point cursorPos = new Point();
cursorPos.X = Cursor.Position.X;
cursorPos.Y = Cursor.Position.Y;
// 当前鼠标位置所在窗口的最高父窗口的hwnd
IntPtr hwnd = WindowFromPoint(cursorPos);
IntPtr parentHwnd;
while (true)
{
parentHwnd = GetParent(hwnd);
if (parentHwnd == IntPtr.Zero) break;
hwnd = parentHwnd;
}
return hwnd;
}
public static bool MouseDown(MouseButtons button)
{
return (Control.MouseButtons & button) == button;
}
public static void AttachWindows(MainForm form, DictForm dictForm)
{
// 调用 GetWindowRect 函数获取窗口位置和大小
Rectangle rect;
if (GetWindowRect(TargetHwnd, out rect))
{
form.Top = rect.Bottom;
form.Left = rect.Left;
// 对齐宽度
if (dictForm.Visible)
{
dictForm.Top = rect.Top;
dictForm.Left = rect.Right;
dictForm.Height = rect.Bottom - rect.Top;
form.Width = rect.Right - rect.Left + dictForm.Width;
}
else
{
form.Width = rect.Right - rect.Left;
}
}
}
}
}