windows10 下 旧系列东方STG 全屏工具 (windows10 一周年版以及以后版本下仅适用于 东方红魔乡)

20 篇文章 0 订阅
6 篇文章 0 订阅

如果链接过期了,可以直接在评论喊我,我看到后会在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;
}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值