csharp
复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WinFormsApp4
{
public partial class Form1 : Form
{
private static System.Threading.Timer _timer;
// WinAPI 函数声明
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", SetLastError = true)]
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
[DllImport("user32.dll")]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
private const int GWL_EXSTYLE = -20;
private const uint SWP_NOZORDER = 0x0004;
private const uint SWP_NOACTIVATE = 0x0010;
private const int WS_EX_TOPMOST = 0x00000008;
private const int WS_EX_NOTOPMOST = 0x00000004;
private const int SWP_NOMOVE = 0x0002; // 不改变窗口位置
private const int SWP_NOSIZE = 0x0001; // 不改变窗口大小
private IntPtr _targetWindowHandle;
public Form1()
{
InitializeComponent();
// 订阅窗体移动和缩放事件
this.Resize += MainForm_Resize;
this.Move += MainForm_Move;
_timer = new System.Threading.Timer(TimerCallback, null, 0, 500);
}
private void TimerCallback(Object o)
{
string className = "WeChatMainWndForPC"; // 修改为实际的类名
string windowName = "微信"; // 修改为实际的窗口标题
// 找到微信窗口的句柄
_targetWindowHandle = FindWindow(className, windowName);
if (_targetWindowHandle == IntPtr.Zero)
{
MessageBox.Show("未找到目标窗口!");
return;
}
// 设置窗口的位置和大小
int x = 50;
int y = 50;
int width = 1920;
int height = 1000;
Size clientSize = this.ClientSize;
Console.WriteLine($"内容区域宽度: {clientSize.Width}, 内容区域高度: {clientSize.Height}");
// 获取整个窗体的大小(包括边框和标题栏)
Size formSize = this.Size;
Console.WriteLine($"窗体宽度: {formSize.Width}, 窗体高度: {formSize.Height}");
if(clientSize.Width != width || clientSize.Height != height)
{
SetWindowPos(_targetWindowHandle, new IntPtr(-1), this.Location.X + 100, this.Location.Y + 100, (int)(clientSize.Width * 0.8), (int)(clientSize.Height * 0.8), SWP_NOZORDER | SWP_NOACTIVATE);
}
// 设置目标窗口置顶
}
private void MainForm_Resize(object sender, EventArgs e)
{
Size clientSize = this.ClientSize;
Console.WriteLine($"内容区域宽度: {clientSize.Width}, 内容区域高度: {clientSize.Height}");
// 获取整个窗体的大小(包括边框和标题栏)
Size formSize = this.Size;
Console.WriteLine($"窗体宽度: {formSize.Width}, 窗体高度: {formSize.Height}");
// 在这里调整目标窗口的大小
if (_targetWindowHandle != IntPtr.Zero)
{
int width = this.Width;
int height = this.Height;
// 根据需要调整大小和位置
SetWindowPos(_targetWindowHandle, new IntPtr(-1), this.Location.X + 100, this.Location.Y +100, (int)(clientSize.Width * 0.8), (int)(clientSize.Height * 0.8), SWP_NOZORDER | SWP_NOACTIVATE);
}
}
private void MainForm_Move(object sender, EventArgs e)
{
Size clientSize = this.ClientSize;
Console.WriteLine($"内容区域宽度: {clientSize.Width}, 内容区域高度: {clientSize.Height}");
// 获取整个窗体的大小(包括边框和标题栏)
Size formSize = this.Size;
Console.WriteLine($"窗体宽度: {formSize.Width}, 窗体高度: {formSize.Height}");
// 在这里调整目标窗口的位置
if (_targetWindowHandle != IntPtr.Zero)
{
// 根据需要调整位置
SetWindowPos(_targetWindowHandle, new IntPtr(-1), this.Location.X + 100, this.Location.Y + 100, (int)(clientSize.Width * 0.8), (int)(clientSize.Height * 0.8), SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
}
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
// 获取内容区域的大小(不包括边框和标题栏)
Size clientSize = this.ClientSize;
Console.WriteLine($"内容区域宽度: {clientSize.Width}, 内容区域高度: {clientSize.Height}");
// 获取整个窗体的大小(包括边框和标题栏)
Size formSize = this.Size;
Console.WriteLine($"窗体宽度: {formSize.Width}, 窗体高度: {formSize.Height}");
// 注意:在OnLoad事件中,如果窗体还未完全显示,
// 那么在某些情况下,Size属性可能不是最终的显示大小。
// 如果您需要确保获取到最终的显示大小,
// 可以考虑在窗体的Shown事件中进行这些操作。
}
}
}