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

这篇具有很好参考价值的文章主要介绍了根据窗口句柄,移动/激活窗口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1.获取窗口句柄

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

2.引入User32函数MoveWindow/ShowWindow

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

        /// <summary>
        /// 设置目标窗体大小,位置
        /// </summary>
        /// <param name="hWnd">目标句柄</param>
        /// <param name="x">目标窗体新位置X轴坐标</param>
        /// <param name="y">目标窗体新位置Y轴坐标</param>
        /// <param name="nWidth">目标窗体新宽度</param>
        /// <param name="nHeight">目标窗体新高度</param>
        /// <param name="BRePaint">是否刷新窗体</param>
        /// <returns></returns>
        [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,用于激活窗口

        /// <summary>
        /// 显示Window
        /// </summary>
        /// <param name="hwnd">句柄</param>
        /// <param name="nCmdShow">
        /// 0    隐藏窗口并激活另一个窗口。
        /// 1    激活并显示窗口。 如果窗口最小化或最大化,系统会将其还原到其原始大小和位置。 首次显示窗口时,应用程序应指定此标志。
        /// 2    激活窗口并将其显示为最小化窗口。
        /// 3    激活窗口并显示最大化的窗口。
        /// 4    在其最近的大小和位置显示一个窗口。 此值类似于 SW_SHOWNORMAL,但窗口未激活。
        /// 5    激活窗口并以当前大小和位置显示窗口。
        /// 6    最小化指定的窗口,并按 Z 顺序激活下一个顶级窗口。
        /// 7    将窗口显示为最小化窗口。 此值类似于 SW_SHOWMINIMIZED,但窗口未激活。
        /// 8    以当前大小和位置显示窗口。 此值类似于 SW_SHOW,但窗口未激活。
        /// 9    激活并显示窗口。 如果窗口最小化或最大化,系统会将其还原到其原始大小和位置。 还原最小化窗口时,应用程序应指定此标志。
        /// 10    根据启动应用程序的程序传递给 CreateProcess 函数的 STARTUPINFO 结构中指定的SW_值设置显示状态。
        /// 11    即使拥有窗口的线程未响应,也会最小化窗口。 仅当将窗口从不同的线程最小化时,才应使用此标志。
        /// </param>
        /// <returns></returns>
        [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);
        /// <summary>
        /// 
        /// </summary>
        /// <param name="bVk">虚拟键值</param>
        /// <param name="bScan">0</param>
        /// <param name="dwFlags">按下0,释放2</param>
        /// <param name="dwExtraInfo">0</param>
        [DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "keybd_event")]
        public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

  2).模拟按键文章来源地址https://www.toymoban.com/news/detail-463121.html

    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)

到了这里,关于根据窗口句柄,移动/激活窗口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Office激活】学校正版Office已激活成功仍弹出激活窗口

    通过学校的Office软件激活窗口,显示已成功激活Office,但是打开相关Office软件仍会弹出激活(登录)窗口,账户设置里显示需要激活。 本机原先预装了家庭版的Office(仅含Word、Excel、PPT),因为课程需要(Acess软件),故卸载了原装的Office,安装了学校的增强版Office2016(20

    2024年02月05日
    浏览(54)
  • 论多窗口相互关联下window.open打开已在的窗口时只激活不刷新的实现方案

    前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言~博主看到后会去代替大家踩坑的~ 主页: oliver尹的主页 格言: 跌倒了爬起来就好~ 来个关注吧,点个赞吧,谢谢 近期,我司有个小伙伴遇到这么个场景实现起来感觉有点

    2024年02月04日
    浏览(35)
  • python --根据windows窗口名称、进程pid打开窗口(pygetwindow详解)

    简介: pygetwindow 是一个Python库,用于获取、操作和管理当前打开的窗口。它提供了一些常用的窗口操作方法,包括获取窗口句柄,获取窗口位置和大小,移动和调整窗口大小,最小化、最大化和还原窗口,以及模拟输入和焦点控制等。 安装 详解 获取当前所有窗口 获取指定标

    2024年02月07日
    浏览(55)
  • HTML标签根据浏览器窗口大小自适应

    1.使用calc实现自适应 (需要父盒子宽高固定) 2.使用flex布局,两栏布局,三栏布局 文章就到这里啦,本人功力尚浅,若有不妥之处请谅解指正,谢谢!

    2024年02月11日
    浏览(39)
  • PyQt5:窗口大小根据屏幕大小自适应调整

     

    2024年02月12日
    浏览(41)
  • Angular:根据浏览器缩放比例,自适应窗口大小

    实际生产过程中,客户有时会提出一些界面优化的需求。拿到需求后,你会发现与前端框架设计理念背道而驰,但也要尽量满足,因为客户就是上帝。 前不久,就接到一个优化需求,客户要求缩放屏幕,界面要自动适应屏幕大小。当时我脑海里闪现了几个字:“太残暴了”!

    2024年02月04日
    浏览(27)
  • js特效——根据鼠标位置移动的图片

    1、offsetX offset意为偏移量,是事件对象距左上角为参考原点的距离。以元素盒子模型的内容区域的左上角为参考点。不包括border。 2、clientX 事件对象相对于浏览器窗口可视区域的X,Y坐标(窗口坐标),可视区域不包括工具栏和滚动条 3、pageX 事件对象相对于整个文档的坐标以像素为

    2024年02月03日
    浏览(38)
  • 【AHK】鼠标调整窗口大小/移动窗口位置/窗口置顶/透明度

    通过AHK,设置窗体大小或位置,首先是两种鼠标调节窗体方案,后面是快捷键,注意修改快捷键的位置有两个,仿照Ubuntu调节窗体的快捷键 Alt+F7、Alt+F8,个人感觉比要按着ALT调节的小工具要好用一点。 如果换成单个F7、F8触发,只需要将多出的GetKeyState删除即可,具体函数意

    2024年02月12日
    浏览(31)
  • 【Unity】摄像机跟随鼠标移动以物体为中心旋转 物体根据视线方向移动

    描述 实现摄像机根据鼠标移动跟随物体旋转,以摄像机前物体为中心,摄像机围绕物体旋转,并使摄像机时刻指向物体 实现效果 Unity 组件设置 Camera 组件设置 Body 组件设置 实现代码 CameraRotateMove.cs 摄像机跟随和旋转 move_better.cs 物体根据按键移动

    2024年02月08日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包