把窗口化的DX魔兽变为全屏再画图

来源:互联网 发布:云计算工程师要求 编辑:程序博客网 时间:2024/04/30 20:05
把窗口化的DX魔兽变为全屏再画图
发送 QQ 消息给 IamHuskarIamHuskar 当前在线添加 IamHuskar 的声望反映此帖

好吧,其实我是为了挂才写的。

魔兽是DX8,全屏独占的,我当初想在这种情况下在界面上绘图,用了好多种方法都是闪烁的问题(D3D HOOK可以,但是需要修改内存),GDI不可能比DX快。

由于启动魔兽的时候可添加-window参数使得魔兽以窗口模式运行,只要把这个窗口模式变为全屏模式,然后创建一个透明窗口置顶蒙在上面,在窗口上面画图,就可以了。


1全屏
第一步,全屏需要隐藏任务栏(显示任务栏)。
代码:
BOOL HideTaskBar(BOOL Hide){      #ifndef ABM_SETSTATE       #define ABM_SETSTATE 0x0000000a       #endif       HWND hWnd = FindWindow("Shell_TrayWnd", NULL);      if(hWnd==NULL)      {        return FALSE;      }       int nCmdShow;       APPBARDATA apBar;        memset(&apBar,0,sizeof(apBar));        apBar.cbSize = sizeof(apBar);        apBar.hWnd =hWnd;         if(Hide)      {        nCmdShow=SW_HIDE;        apBar.lParam=ABS_AUTOHIDE;      }      else      {        nCmdShow=SW_SHOW;        apBar.lParam=ABS_ALWAYSONTOP;      }       SHAppBarMessage(ABM_SETSTATE,&apBar);       ShowWindow(hWnd,nCmdShow);       return TRUE;}



第二步:去掉窗口化魔兽的边框,然后最大化

代码:
{  HWND hWar3=::FindWindow("Warcraft III",NULL);  if(hWar3==NULL)  {    MessageBox("没有发现魔兽","ERROR",0);    return;  }           //这里直接设置dwStyle,dwExStyle 的数据是没有办法,我测试去掉很多窗口风格属性      //但是还是没法去掉边框,只好找了一个没边框的获取他的style和exstyle。              DWORD dwStyle =0x94000044;   DWORD dwExStyle = 0x50000;              //设置风格  ::SetWindowLong(hWar3,GWL_STYLE,dwStyle);              ::SetWindowLong(hWar3, GWL_EXSTYLE,dwExStyle);               //最大化窗口 SW_SHOWMAXIMIZED  ::ShowWindow(hWar3,3);}

3:创建透明窗口,然后设置风格(我这里是直接用的MFC快速生成了一个窗口,)
代码:
BOOL CTOUMINGDlg::OnInitDialog(){  CDialog::OnInitDialog();    typedef BOOL (WINAPI * MYFUNC)(HWND , COLORREF,BYTE,DWORD);//设置窗口透明    SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)|0x80000);    HINSTANCE hInst=LoadLibrary("User32.DLL");    if(hInst)    {        MYFUNC fun=NULL;        fun=(MYFUNC)GetProcAddress(hInst,"SetLayeredWindowAttributes");        if(fun)              fun(this->GetSafeHwnd(),0,50,2);             //注意这里参数,为了看到效果,我把没有设置为完全透明        FreeLibrary(hInst);    }//设置窗口置顶。    CRect rect;    GetClientRect(&rect);    ::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, rect.Width(), rect.Height(),SWP_NOMOVE);//使得对该窗口的操作无效。也就是透过这个窗口进行点击窗口后面的东西//这样这个窗口只能通过任务管理器关闭 ,或者把之前的风格修改回来。//这里我是看了一下千千静听的锁定桌面歌词如何做到的。       ::SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,0x000800a8);  SetIcon(m_hIcon, TRUE);               // Set big icon  SetIcon(m_hIcon, FALSE);    // Set small icon    // TODO: Add extra initialization here    return TRUE;  // return TRUE  unless you set the focus to a control}
最后的效果就是全屏上面有窗口,不会闪烁。
其实就是伪全屏+锁定桌面歌词



有没有办法在真正的DX全屏独占模式下绘图不闪烁??(D3D HOOK除外)