互动直播 之 全屏播放时 鼠标隐藏功能

目录

一、鼠标自动隐藏显示

1、鼠标移动时,记录移到时的时间点,并显示鼠标

2、设置一个重复循环,每秒判断下

3、退出全屏时,结束是否隐藏任务判断


想实现的功能和播放器类似,全屏时,鼠标悬停几秒后,自动隐藏起来。

一、鼠标自动隐藏显示

1、鼠标移动时,记录移到时的时间点,并显示鼠标

cpp 复制代码
		else if (uMsg == WM_MOUSEMOVE)
		{
				if (isFullScreen_)
				{
					mouseKeepStillBeginTime_ = GetCurTimeStamp();
					ShowMyCursor();
					
				}
		}
cpp 复制代码
 int64_t GetCurTimeStamp()
 {
	 timeb time_now;
	 ftime(&time_now); // 秒数
	 int64_t cur_timestamp = time_now.time * 1000 + time_now.millitm; // 毫秒
	 return cur_timestamp;
 }

2、设置一个重复循环,每秒判断下

根据当前的时间和之前移动时记录的时间,判断有无超过指定的秒数,来确定是否隐藏

cpp 复制代码
			mouse_autoHide_timer_.Cancel();
			StdClosure task = [this]() {

				if (pExerciseForm&&IsWindowVisible(pExerciseForm->GetHWND()))
				{
					ShowMyCursor();
				}
				else{
					int64_t now = GetCurTimeStamp();
					int64_t dis = now - mouseKeepStillBeginTime_;

					if (dis > 1000)
					{
						HideMyCursor();
					}
				}

					
			};
			nbase::ThreadManager::PostRepeatedTask(kThreadUI, mouse_autoHide_timer_.ToWeakCallback(task), nbase::TimeDelta::FromMilliseconds(1000));
cpp 复制代码
typedef std::function<void(void)> StdClosure;

3、退出全屏时,结束是否隐藏任务判断

cpp 复制代码
			isFullScreen_ = false;		
			mouse_autoHide_timer_.Cancel();
		
			ShowMyCursor();

如果想了解如何控制的话,可以参考下面代码,我这里直接使用了这种方法

cpp 复制代码
class BASE_EXPORT WeakCallbackFlag final : public SupportWeakCallback
{
public:
	void Cancel()
	{
		m_weakFlag.reset();
	}

	bool HasUsed()
	{
		return m_weakFlag.use_count() != 0;
	}
};
cpp 复制代码
class BASE_EXPORT SupportWeakCallback
{
public:
	virtual ~SupportWeakCallback(){};

	template<typename CallbackType>
	auto ToWeakCallback(const CallbackType& closure)
		->WeakCallback<CallbackType>
	{
		return WeakCallback<CallbackType>(GetWeakFlag(), closure);
	}

	std::weak_ptr<WeakFlag> GetWeakFlag()
	{
		if (m_weakFlag.use_count() == 0) {
			m_weakFlag.reset((WeakFlag*)NULL);
		}
		return m_weakFlag;
	}

private:
	template<typename ReturnValue, typename... Param, typename WeakFlag>
	static std::function<ReturnValue(Param...)> ConvertToWeakCallback(
		const std::function<ReturnValue(Param...)>& callback, std::weak_ptr<WeakFlag> expiredFlag)
	{
		auto weakCallback = [expiredFlag, callback](Param... p) {
			if (!expiredFlag.expired()) {
				return callback(p...);
			}
			return ReturnValue();
		};

		return weakCallback;
	}

protected:
	std::shared_ptr<WeakFlag> m_weakFlag;
};
相关推荐
南国之风23 天前
Windows使用AutoHotKey解决鼠标键连击现象(解决鼠标连击、单击变双击的故障)
鼠标·罗技·autohotkey·g304
梦茹^_^1 个月前
算法进阶:贪心算法
开发语言·python·算法·贪心算法·时间戳·背包
极客代码1 个月前
C语言时间戳处理完全解析:掌握高效日期和时间操作的关键
c语言·开发语言·时间·时间戳·time
亿牛云爬虫专家2 个月前
深入探讨 Puppeteer 如何使用 X 和 Y 坐标实现鼠标移动
爬虫代理·puppeteer·鼠标·代理ip·小红书·16yun·用户行为
HarlanC3 个月前
FFmpeg转码音视频时间戳设置分析
ffmpeg·音视频·时间戳
不喝水的鱼儿3 个月前
【LuatOS】修改LuatOS源码为PC模拟器添加高精度时间戳库timeplus
lua·时间戳·luatos
橘色的喵4 个月前
使用shell实现高精度时间日志记录与时间跳变检测
时间戳·timestamp·时间跳变·时间回退
浪游东戴河5 个月前
电脑办公之基础操作(持续更新)
鼠标·快捷键·复制·办公·ctrl
C盘清理5 个月前
给鼠标一个好看的指针特效 鼠标光标如何修改形状?
鼠标·鼠标光标·鼠标指针·鼠标美化·鼠标形状
tekin6 个月前
golang 转换时间戳到字符串函数 支持秒和毫秒时间戳 转换到自定字符串
开发语言·后端·golang·时间戳·time·format·时间戳转换为字符串