下面是改变全屏程序的窗体类型代码
全屏程序是在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消息)后来我跟踪了一个已经能成功将我的两个程序都窗口化的软件,发现它里面的方法以及调用函数的顺序都和我的一样的,但是它的那软件就可以把全屏程序窗口化,而我的这个,只会把全屏程序变成一个死掉的窗口函数,
有高人研究过这个问题吗?
或者,有这方面的源程序吗?
要是能解决我这个问题,我将万分感谢呀!
(早期某些经典软件,唯一遗憾是全屏的,而且已经没有更新的版本了,所以我想把他们都编程窗口化)
全屏程序是在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消息)后来我跟踪了一个已经能成功将我的两个程序都窗口化的软件,发现它里面的方法以及调用函数的顺序都和我的一样的,但是它的那软件就可以把全屏程序窗口化,而我的这个,只会把全屏程序变成一个死掉的窗口函数,
有高人研究过这个问题吗?
或者,有这方面的源程序吗?
要是能解决我这个问题,我将万分感谢呀!
(早期某些经典软件,唯一遗憾是全屏的,而且已经没有更新的版本了,所以我想把他们都编程窗口化)
解决方案 »
- activex控件调用其他dll
- iocp如何检测客户端的退出呢?
- 关于计算直线度的公式?
- UDP实现的TraceRoute
- 我这边socket的send显示发送了字节,而目标的recv却说收到0字节,这是怎么回事?
- msxml如何使取得字符串时不忽略前后面的空格
- TAB控件上有一个BUTTON1,在包含该TAB控件的DIALOG上的BUTTON2中怎样触发BUTTON1?
- 如何使用资源文件?
- 比如,对于系统的math.h,我想看看它的实现文件(.cpp),在哪里看呢?好像在目录里找不到,只有头文件?
- 求教一个问题从系统服务中启动进程的问题
- 谁有计算机常用算法这本书的盘?徐士良编的那本
- 如何取得屏幕的窗口上某一点的颜色。
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是什么属性来着?*/
然后我就用SetWindowLong来改变窗口类型,使其拥有WS_CAPTION属性,但是,一调用SetWindowLong后,马上我的那个窗口处理函数就再也不会被调用,不过通过北京音乐,可能那个程序应该还是在运行(仅仅只是可能)