对最小化的窗口截图/取色的问题

DSK01R 2015-06-09 09:21:18
查了不少地方,找到的资料的意思是最小化之后窗口为了节省性能开支就没有继续刷新了,所以取不到。
网上的解决方法是取屏幕的分辨率,然后把目标窗口移动到右下角去,这样在屏幕上看不见这个窗口,看起来和最小化差不多,取色也可以取到,但是这样做一般是用bottom点击之类的来做,和一般窗口操作习惯不同,用起来很别扭。
我想问下,我现在有这个程序中的一个窗口的句柄,没有这个程序的源码
1.可不可以令最小化的程序窗口强制继续刷新
2.可不可以把窗口最小化、恢复按钮的点击/任务栏点击 事件改成我自己定义的操作(就是最小化就移动出屏幕,恢复窗口的时候移回来)
谢谢。
...全文
1580 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
橘子皮... 2015-10-06
  • 打赏
  • 举报
回复
你这个办法肯定会影响别人的操作啊 有其他办法的,不过我也不知道
qq_15982395 2015-10-06
  • 打赏
  • 举报
回复
没有别的办法码。
DSK01R 2015-06-11
  • 打赏
  • 举报
回复
我嘞个去— —不是回复没发现写错一个变量应该是h_S,不过不影响就是了。。。
DSK01R 2015-06-11
  • 打赏
  • 举报
回复
引用 5 楼 Z65443344 的回复:
这是啥需求? 抓取别人程序上的图像?? 即使别人程序都最小化了,也要继续抓图像???
恩,不过最小化之后不是就不再绘图了嘛,所以我现在就根据句柄检测窗口是不是最小化了,最小化就把他恢复到屏幕外面去,焦点回到窗口就移动回来,用起来和最小化没区别,也不影响截图
        private void FakeMin()
        {
            while (true)
            {
                if (p == -1)
                {
                    fakeMinOff();
                    return;
                } 
                while (p==0)
                {
                    Win32.Rect rc = new Win32.Rect();
                    Win32.GetWindowRect(hWndOld_W, ref rc);
                    x_W = (int)rc.left;
                    y_W = (int)rc.top;
                    w_W = rc.right - rc.left;
                    h_W = rc.bottom - rc.top;
                    Thread.Sleep(200);
                }
                if (p==4)
                {
                    if (IsIconic(hWndOld_W))
                    {
                        p = 1;
                        goto Min;
                    }; 
                    Win32.Rect rc = new Win32.Rect();
                    Win32.GetWindowRect(hWndOld_W, ref rc);
                    x_W = (int)rc.left;
                    y_W = (int)rc.top;
                    w_W = rc.right - rc.left;
                    h_W = rc.bottom - rc.top;
                    Thread.Sleep(200);
                                     
                }
            Min:
                switch (p)
                {
                    case 1:
                        ShowWindow(hWndOld_W, 1);
            MoveWindow(hWndOld_W, w_S, w_S, w_W, h_W, true);
                        Thread.Sleep(1000);
                        p = 3;
                        break;
                    case 2:
                        MoveWindow(hWndOld_W, x_W, y_W, w_W, h_W, true);
                        Thread.Sleep(1000);
                        p = 4;
                        break;
                    case 3:
                        if (GetForegroundWindow() == hWndOld_W) p = 2;
                        Thread.Sleep(200);
                        break;
                    default:
                        break;
                }
            }
        }
w_S, w_S是屏幕分辨率
於黾 2015-06-11
  • 打赏
  • 举报
回复
这是啥需求? 抓取别人程序上的图像?? 即使别人程序都最小化了,也要继续抓图像???
DSK01R 2015-06-11
  • 打赏
  • 举报
回复
引用 3 楼 wsh1992o 的回复:
为什么楼主在自问自答
因为我发帖之后还在想,查资料啊什么的,然后发现完事了啊。。。
存钱买冰棍 2015-06-10
  • 打赏
  • 举报
回复
为什么楼主在自问自答
DSK01R 2015-06-10
  • 打赏
  • 举报
回复
发现用API+句柄就行了,不需要hook,大概这样,启用这个功能的时候开一个线程
        void FakeMin()
        {
            while (true)
            {
                if (p == -1) return;
                while (p==0)
                {
                    Thread.Sleep(200);
                }
                if (IsIconic(hWndOld_W)) p = 1;
                if (GetForegroundWindow() == hWndOld_W) p = 2;
                switch (p)
                {
                    case 1:
                        fakeMinOn();
                        p = 3;
                        break;
                    case 2:
                        fakeMinOff();
                        p = 3;
                        break;
                    case 3:
                        Thread.Sleep(200);
                        break;
                    default:
                        break;
                }
            }
        }
另外两个函数不贴了,就是记录坐标窗口大小移动窗口之类的。
DSK01R 2015-06-09
  • 打赏
  • 举报
回复
我的想法是用钩子,窗口有最小化消息的时候记录窗口坐标,移动到在屏幕外,焦点回到窗口的时候把窗口移动回之前记录的坐标的位置,程序关闭的时候检查窗口是否在屏幕外,如果在外面就将窗口移回最近一次坐标位置,然后最小化。 不知道这样想对不对

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧