如果链接过期了,可以直接在评论喊我,我看到后会在3天内补上。
另外,下面的源代码是完整的,着急的话,可以直接copy下来,用 visual studio 就可以马上编译和生成。
2016/8/17 更新
windows10 一周年更新 已经解决了全屏带边框问题,对于 东方红魔乡 以外的东方STG游戏,此工具已作废
此工具目前仅用于解决 东方红魔乡 帧数飞起问题
以下为旧的---------
在 windows10 解决 旧系列东方STG 全屏带边框问题
已测试
东方红魔乡
东方妖妖梦
东方花映冢
本程序用于处理在 win10 系统下 旧系列的东方STG 全屏后带边框的问题
同时能解决 东方红魔乡 全屏后帧数飞起问题
如果你的游戏全屏正常,请不要使用此程序
使用说明
1.启动本程序
2.使用 custom.exe 设置为窗口模式,或者,进入东方游戏,并且设置为窗口模式
3.进入 东方STG 游戏界面
4.然后按下键盘上的 F11 键
5.边框消失了!愉快地擦弹吧!
按下 Delete 或 关掉本程序的窗口 自动退出 全屏模式 和 本程序
注意事项
程序启动后,不要在非游戏界面乱按 F11键,不然出什么问题不关我事。。。。
如果无效,请尝试右键以管理员权限启动本程序,一般不会这样,除非你设置了 以兼容模式启动 游戏
程序版本:1.0"
本程序开源,源代码无限制自由修改使用
作者:ONE_SIX_MIX
成品程序下载:https://cloud.189.cn/t/bqmIjuVJ36vm (东方STG 全屏工具.7z)
源代码工程打包:https://cloud.189.cn/t/bqmIjuVJ36vm (windowToFullscreen 源码.7z)
完整代码
#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;
HHOOK keyboardHook = 0;
HANDLE exitEvent = 0;
unsigned long long ignoreRepeatedKeysInShortTime = 0; //忽略短时间内的重复击键
LRESULT CALLBACK HookCallback(int code, WPARAM wParam, LPARAM lParam)
{
KBDLLHOOKSTRUCT *ks = (KBDLLHOOKSTRUCT*)lParam;
if (ks->vkCode == VK_F11)
{
HWND w = GetForegroundWindow();
char str[260] ={0};
GetWindowTextA(w, str, 259);
//避免对调试器产生影响
if(string(str).find("Visual Studio") != string::npos)
return CallNextHookEx(0, code, wParam, lParam);
//一般在获取系统窗口句柄时会获取失败
if (w == 0)
{
cout << "得到窗口句柄失败" << endl;
return CallNextHookEx(0, code, wParam, lParam);
}
//忽略短时间的重复按键
{
if ((GetTickCount64() - ignoreRepeatedKeysInShortTime - 3000) < ignoreRepeatedKeysInShortTime)
{
return 1;
}
ignoreRepeatedKeysInShortTime = GetTickCount64();
}
//选择最佳分辨率,分辨率尽可能大
UINT width = GetSystemMetrics(SM_CXSCREEN);
UINT height = GetSystemMetrics(SM_CYSCREEN);
{
if (width >= 1280 && height >= 1024)
{
//这个好,东方绀珠传 的分辨率
width = 1280;
height = 1024;
}
else if(width >= 1024 && height >= 768)
{
width = 1024;
height = 768;
}
else
{
width = 640;
height = 480;
}
}
LONG style = GetWindowLongA(w, GWL_STYLE); //获得窗口风格
style &= ~(WS_CAPTION | WS_SIZEBOX); //去除窗口标题和可调节风格,窗口全屏显示且不可改变大小
style = SetWindowLongA(w, GWL_STYLE, style); //设置窗口风格
DEVMODE dm ={0};
dm.dmSize = sizeof(dm);
dm.dmPelsWidth = width;
dm.dmPelsHeight = height;
dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
auto ret = ChangeDisplaySettingsA(&dm, CDS_FULLSCREEN);
if (ret != DISP_CHANGE_SUCCESSFUL)
cout << "全屏切换失败" << endl;
SetWindowPos(w, HWND_NOTOPMOST, 0, 0, 1280, 1024, 0);
return 1;
}
else if (ks->vkCode == 'P')
{
//test
HWND w = GetForegroundWindow();
if (w == 0)
{
cout << "得到窗口句柄失败" << endl;
return CallNextHookEx(0, code, wParam, lParam);
}
char str[260] ={0};
GetWindowTextA(w, str, 259);
cout << "窗口标题:" << str << endl;
RECT r ={0};
GetWindowRect(w, &r);
cout << "x:" << r.left << endl << "y:" << r.top << endl << "cx:" << r.right << endl << "cy:" << r.bottom << endl;
UINT width = GetSystemMetrics(SM_CXSCREEN);
UINT height = GetSystemMetrics(SM_CYSCREEN);
cout << "当前屏幕分辨率:" << width << "x" << height << endl << endl;
return CallNextHookEx(0, code, wParam, lParam);
}
else if(ks->vkCode == VK_DELETE)
{
SetEvent(exitEvent);
return 1;
}
return CallNextHookEx(0, code, wParam, lParam);
}
int main()
{
exitEvent = CreateEventA(0, FALSE, FALSE, 0);
keyboardHook = SetWindowsHookExA(WH_KEYBOARD_LL, HookCallback, GetModuleHandleA(0), 0);
if (keyboardHook == 0)
{
cout << "挂钩键盘失败" << endl;
cout << "按下回车键结束" << endl;
getchar();
return -1;
}
cout << "程序正常运行" << endl << endl;
//说明文件
{
cout << "本程序用于处理在 win10 系统下 旧系列的东方STG 全屏后带边框的问题" << endl;
cout << "同时能解决 东方红魔乡 全屏后帧数飞起问题" << endl;
cout << "如果你的游戏全屏正常,请不要使用此程序"<< endl << endl;
cout << "使用说明:" << endl;
cout << "1.启动本程序" << endl;
cout << "2.使用 custom.exe 设置为窗口模式,或者,进入东方游戏,并且设置为窗口模式" << endl;
cout << "3.进入 东方STG 游戏界面" << endl;
cout << "4.然后按下键盘上的 F11 键" << endl;
cout << "5.边框消失了!愉快地擦弹吧!" << endl << endl;
cout << "按下 Delete 或 关掉本程序的窗口 自动退出 全屏模式 和 本程序" << endl << endl;
cout << "注意事项" << endl;
cout << "程序启动后,不要在非游戏界面乱按 F11键,不然出什么问题不关我事。。。。" << endl;
cout << "如果无效,请尝试右键以管理员权限启动本程序,一般不会这样,除非你设置了 以兼容模式启动 游戏" << endl << endl;
cout << "程序版本:1.0" << endl;
cout << "本程序开源,源代码无限制自由修改使用" << endl;
cout << "作者:ONE_SIX_MIX" << endl << endl;
}
MSG msg;
do
{
if (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
else
{
if (WaitForSingleObject(exitEvent, 1) == WAIT_OBJECT_0)
break;
}
} while (msg.message != WM_QUIT);
UnhookWindowsHookEx(keyboardHook);
cout << "程序正常退出" << endl;
return 0;
}