根据窗口句柄,移动/激活窗口

根据窗口句柄,移动/激活窗口

根据窗口句柄,移动/激活窗口

1.获取窗口句柄

获取窗口句柄上篇随笔有写,不再做赘述

2.引入User32函数MoveWindow/ShowWindow

引入MoveWindow,用于移动窗口,设置 SetLastError = true,若移动窗口失败,方便查找问题

///

/// 设置目标窗体大小,位置

///

/// 目标句柄

/// 目标窗体新位置X轴坐标

/// 目标窗体新位置Y轴坐标

/// 目标窗体新宽度

/// 目标窗体新高度

/// 是否刷新窗体

///

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]

public static extern int MoveWindow(IntPtr hWnd, int x, int y, int nWidth, int nHeight, bool BRePaint);

引入ShowWindow,用于激活窗口

///

/// 显示Window

///

/// 句柄

///

/// 0 隐藏窗口并激活另一个窗口。

/// 1 激活并显示窗口。 如果窗口最小化或最大化,系统会将其还原到其原始大小和位置。 首次显示窗口时,应用程序应指定此标志。

/// 2 激活窗口并将其显示为最小化窗口。

/// 3 激活窗口并显示最大化的窗口。

/// 4 在其最近的大小和位置显示一个窗口。 此值类似于 SW_SHOWNORMAL,但窗口未激活。

/// 5 激活窗口并以当前大小和位置显示窗口。

/// 6 最小化指定的窗口,并按 Z 顺序激活下一个顶级窗口。

/// 7 将窗口显示为最小化窗口。 此值类似于 SW_SHOWMINIMIZED,但窗口未激活。

/// 8 以当前大小和位置显示窗口。 此值类似于 SW_SHOW,但窗口未激活。

/// 9 激活并显示窗口。 如果窗口最小化或最大化,系统会将其还原到其原始大小和位置。 还原最小化窗口时,应用程序应指定此标志。

/// 10 根据启动应用程序的程序传递给 CreateProcess 函数的 STARTUPINFO 结构中指定的SW_值设置显示状态。

/// 11 即使拥有窗口的线程未响应,也会最小化窗口。 仅当将窗口从不同的线程最小化时,才应使用此标志。

///

///

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]

public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);

3.移动并激活窗口的一些细节

移动并激活窗口后,可能会因为一些原因,导致窗口移动了,也激活了,但被叠在其他窗口下面。

预设两种方案:

1).遍历所有窗口,并用ShowWindow隐藏

2).模拟按下Win + M 最小化所有窗口,再激活需要调整的窗口

这里只对第二种方案做示例:

1).引入User32函数keybd_event

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]

public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);

///

///

///

/// 虚拟键值

/// 0

/// 按下0,释放2

/// 0

[DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "keybd_event")]

public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

2).模拟按键

keybd_event(0x5B, 0, 0, 0);

keybd_event(77, 0, 0, 0);

keybd_event(0x5B, 0, 0x02, 0);

keybd_event(77, 0, 0x02, 0); //0x5B == Win键 //77 == M键

4.示例:将两个窗口在屏幕上并排显示,实现分屏效果

var width = Screen.PrimaryScreen.WorkingArea.Width / 2;

var height = Screen.PrimaryScreen.WorkingArea.Height;

keybd_event(0x5B, 0, 0, 0);

keybd_event(77, 0, 0, 0);

keybd_event(0x5B, 0, 0x02, 0);

keybd_event(77, 0, 0x02, 0);

Task.Run(() =>

{

Task.Delay(500).Wait();

ShowWindow(WindowsHandle1, 1);

MoveWindow(WindowsHandle1, 0, 0, width, height, true);

ShowWindow(WindowsHandle2, 1);

MoveWindow(WindowsHandle2, width, 0, width, height, true);

});

5.获取MoveWindow的LastError

//上方调用MoveWindow

int i = System.Runtime.InteropServices.Marshal.GetLastWin32Error();

系统错误代码 (0-499) (0x0-0x1f3)

系统错误代码 (500-999) (0x1f4-0x3e7)

系统错误代码 (1000-1299) (0x3e8-0x513)

系统错误代码 (1300-1699) (0x514-0x6a3)

系统错误代码 (1700-3999) (0x6a4-0xf9f)

系统错误代码 (4000-5999) (0xfa0-0x176f)

系统错误代码 (6000-8199) (0x1770-0x2007)

系统错误代码 (8200-8999) (0x2008-0x2327)

系统错误代码 (9000-11999) (0x2328-0x2edf)

系统错误代码 (12000-15999) (0x2ee0-0x3e7f)

相关推荐

如何解锁联想笔记本电脑的键盘:分步指南
趣投必发365

如何解锁联想笔记本电脑的键盘:分步指南

🗓️ 08-17 👁️ 5700
湖南长沙麻将规则 长沙麻将技巧顺口溜 长沙麻将怎么打攻略
神武武器满攻怎么算 附上武器满攻属性
365bet是什么

神武武器满攻怎么算 附上武器满攻属性

🗓️ 07-22 👁️ 2013
国内怎么买兰博基尼
365bet提款条件

国内怎么买兰博基尼

🗓️ 09-04 👁️ 8649
男朋友不爱你的表现有哪些
365bet是什么

男朋友不爱你的表现有哪些

🗓️ 07-14 👁️ 1608
如何发长微博:一篇全面的攻略,助你突破字数限制
手机闪存有什么用 手机闪存重要吗
趣投必发365

手机闪存有什么用 手机闪存重要吗

🗓️ 08-18 👁️ 6235
外阴毛囊炎常见吗?
365bet是什么

外阴毛囊炎常见吗?

🗓️ 07-14 👁️ 5699
女足世界杯
365bet提款条件

女足世界杯

🗓️ 08-09 👁️ 5292
阴阳师火灵哪里刷 御魂火灵属性介绍
趣投必发365

阴阳师火灵哪里刷 御魂火灵属性介绍

🗓️ 08-12 👁️ 5443
医院开“世界杯综合症门诊” 保险公司卖“杯剧险”
拍拍贷是哪的?看完你就能全部搞清楚
365bet提款条件

拍拍贷是哪的?看完你就能全部搞清楚

🗓️ 07-11 👁️ 4304