下面是改变全屏程序的窗体类型代码
全屏程序是在640*480的分辨率下运行的
我的桌面默认分辨率是1024*768
以下的代码是保证在与那个全屏程序同一个进程内执行的。
ChangeDisplaySettings(NULL,0);//屏幕分辨率改成桌面默认(此时全屏程序仍然能全屏正常运行)
prevproc=(PROC)GetWindowLong(hwnd,GWL_WNDPROC);
SetWindowLong(hwnd,GWL_WNDPROC,(long)MyProc);//设置窗体消息过滤函数(函数见下面),设置好 后,那个全屏程序仍然能正常运行,而且此时可以随便按WIN键切换出任务栏。DWORD style=GetWindowLong(hwnd,GWL_STYLE);
style =  style | WS_CAPTION;
SetWindowLong(hwnd,GWL_STYLE,style);//给全全屏程序的窗体设置标题栏,这行只要一执行,全屏游戏,马上就缩小成640*480的窗口模式(但并没有标题栏),同时,这个窗口将不接受任何消息,整个窗口就和死了一样,但是程序内部还是在运行的(程序的声音部分还在运行),这样下面的那些代码基本就执行不下去了。DWORD exstyle=GetWindowLong(hwnd,GWL_EXSTYLE);
exstyle = exstyle | 0x40100;
SetWindowLong(hwnd,GWL_EXSTYLE,exstyle);
SetWindowPos(hwnd,HWND_NOTOPMOST ,0 ,0 ,648 ,505 ,SWP_SHOWWINDOW);
ShowCursor(true);窗口消息过滤函数
主要是为了欺骗全屏程序让它以为自己还是在一个全屏模式下工作
switch(message)
{
case WM_ACTIVATEAPP://0x1c
case WM_ACTIVATE://0x6
case WM_SETFOCUS: //0x7
case WM_KILLFOCUS:  //0x8
return 0;
default:
break;}
        return CallWindowProcA((WNDPROC)prevproc,hWnd,message,wParam,lParam);
这个问题,我实在想不通了,为什么SetWindowLong后或者,在给全屏程序设置好窗体消息过滤函数后,那怕只是调用MoveWindow函数,都会使这个全屏程序类似死掉一样(不接受任何windows消息)后来我跟踪了一个已经能成功将我的两个程序都窗口化的软件,发现它里面的方法以及调用函数的顺序都和我的一样的,但是它的那软件就可以把全屏程序窗口化,而我的这个,只会把全屏程序变成一个死掉的窗口函数,
    有高人研究过这个问题吗?
    或者,有这方面的源程序吗?
    要是能解决我这个问题,我将万分感谢呀!
    (早期某些经典软件,唯一遗憾是全屏的,而且已经没有更新的版本了,所以我想把他们都编程窗口化)

解决方案 »

  1.   

    以下是给mu窗口化的程序:(我没测试过)style= GetWindowLong(hwndmu,GWL_STYLE);
    style=style | WS_CAPTION ;
    SetWindowLong(hwndmu,GWL_STYLE,style);
    //修改窗体的exstyle属性
    exstyle=GetWindowLong(hwndmu,GWL_EXSTYLE);
    exstyle=exstyle | WS_EX_APPWINDOW | WS_EX_WINDOWEDGE   ;
    SetWindowLong(hwndmu,GWL_EXSTYLE,exstyle);
    //设置窗体的位置,取消其最前端显示,为图简单807,632是我自己随便设的
    //当然最好是先用AdjustWindowRect函数调整一下大小
    SetWindowPos(hwndmu,HWND_NOTOPMOST,0,0,807,632,SWP_SHOWWINDOW);
    ShowWindow(hwndmu,SW_SHOWNORMAL);
    //修改窗体的回调函数地址到我们自己定义的回调函数
    oldproc=(FARPROC)GetWindowLong(hwndmu,GWL_WNDPROC);
    if(SetWindowLong(hwndmu,GWL_WNDPROC,(long)WINPROC)==0)
    return false;
    return true;
    }
    //---------------------------------------------------------
    //自己定义的回调函数
    LRESULT CALLBACK WINPROC(HWND hwnd,UINT umsg,WPARAM wparam,LPARAM lparam)
    {
    //消息过滤       
    switch (umsg)        
    {        
    case WM_ACTIVATEAPP:        
    case WM_ACTIVATE:        
    case WM_KILLFOCUS:        
    case WM_SETFOCUS:        
    case WM_CLOSE:       
    return 0;
    //这里是个关键,把这个计时器kill        
    case WM_TIMER:       
    if(wparam==0x3e9)       
    KillTimer(hwnd,wparam);       
    break;       
    }       
    return CallWindowProc(oldproc,hwnd,umsg,wparam,lparam);        
    }
    /*借问一下:EXSTYLE里面的0x40100是什么属性来着?*/
      

  2.   

    但是我用来实验的程序是我自己写的一个很简单的全屏的OpenGl程序,里面根本没有检测自己的窗口函数是否被替换的代码呀?
      

  3.   

    我已经测试过了,当我仅仅替换窗口处理函数的话,我自己的那个窗口处理函数确实会被调用,而且工作很正常,
    然后我就用SetWindowLong来改变窗口类型,使其拥有WS_CAPTION属性,但是,一调用SetWindowLong后,马上我的那个窗口处理函数就再也不会被调用,不过通过北京音乐,可能那个程序应该还是在运行(仅仅只是可能)
      

  4.   

    我刚才试了一下,没问题啊。我是在一个OPENGL的全屏程序下面测试的,按下快捷键,马上将全屏程序窗口化了