Windows非公开API函数的调用办法
2023-09-14 09:10:49 时间
我们为解决某些特殊的问题时,可能会用到Windows非公开API接口,当我们把非公开的API写进代码后,编译器则会因为找不到函数定义的地方,报出未定义的错误。此时,我们可以通过显式的Load系统的user32.dll库,获得对应的函数接口指针,通过函数指针去调用对应的函数。下面通过两个实例来说明一下。
1、调用GetLastInputInfo函数,获取系统最后一次接收输入的时间,以实现类似QQ离开状态的自动检测
离开状态自动检测的原理:调用调用GetLastInputInfo函数,获取系统最后一次接收输入的时间,然后与当前时间做差值,再与设定的离开时间检测值,做比较以判断当前是否是离开状态。具体的,设定一个定时器去定时的获取系统最后一次接收输入的时间,进而实现离开状态的实时检测。当然也可以开一个线程来检测。相关代码如下所示。
typedef struct tagLASTINPUTINFO {
UINT cbSize;
DWORD dwTime;
} LASTINPUTINFO, * PLASTINPUTINFO;
typedef BOOL (WINAPI* PGETLASTINPUTINFO)(PLASTINPUTINFO plii);
PGETLASTINPUTINFO pfnGetLastInputInfo = NULL;
pfnGetLastInputInfo = (PGETLASTINPUTINFO)GetProcAddress(hSysDll, "GetLastInputInfo"); // 获取GetLastInputInfo函数接口指针
if( NULL == GetLastInputInfo )
{
FreeLibrary( hSysDll );
}
LASTINPUTINFO lpi;
lpi.cbSize = sizeof(lpi);
pfnGetLastInputInfo(&lpi);
DWORD dwTime = lpi.dwTime;
DWORD dwSec = GetTickCount() - lpi.dwTime;
......
2、调用ChangeWindowMessageFilter函数,放行WM_DROPFILES消息和WM_COPYGLOBALDATA消息,以解决Win7系统中文件拖放失效的问题
由于Win7的安全机制,导致与文件拖放的WM_DROPFILES消息和WM_COPYGLOBALDATA消息被系统拦截了,从而导致了文件拖放失效的问题。解决问题的办法就是,调用ChangeWindowMessageFilter函数,放行WM_DROPFILES消息和WM_COPYGLOBALDATA消息。相关代码如下所示。
// 放行文件拖放相关事件消息,仅对win7有效,以解决win7中文件拖放失效的问题
ChangeWndMessageFilter( WM_DROPFILES, TRUE );
ChangeWndMessageFilter( 0x0049, TRUE ); // 0x0049 - WM_COPYGLOBALDATA
BOOL CXXXApp::ChangeWndMessageFilter( UINT uMessage, BOOL bAllow )
{
typedef BOOL (WINAPI* ChangeWindowMessageFilterFn)( UINT, DWORD );
HMODULE hUserMod = NULL;
BOOL bResult = FALSE;
hUserMod = LoadLibrary( "user32.dll" );
if ( hUserMod == NULL )
{
return FALSE;
}
// 获取ChangeWindowMessageFilter函数接口指针
ChangeWindowMessageFilterFn pfnChangeWindowMessageFilter = (ChangeWindowMessageFilterFn)GetProcAddress( hUserMod, "ChangeWindowMessageFilter" );
if ( pfnChangeWindowMessageFilter == NULL )
{
FreeLibrary( hUserMod );
return FALSE;
}
bResult = pfnChangeWindowMessageFilter( uMessage, bAllow?1:2 ); // 1-MSGFLT_ADD, 2-MSGFLT_REMOVE
FreeLibrary( hUserMod );
return bResult;
}
遇到问题时,我们找不到直接的办法,可以通过间接的方法来解决或规避问题。
相关文章
- Windows数据恢复
- windows环境下tomcat部署war包[通俗易懂]
- windows api编程入门_WindowsAPI调用DLL
- 基于Windows Server 2012 R2的DNS服务器搭建详解
- Windows如何通过WSL2安装Redis7
- 如何激活 Office、Visio、Project 和 Windows
- PyTorch 1.7发布:支持CUDA 11、Windows分布式训练
- 安卓手机摄像头变成电脑(windows)的摄像头(DroidCam 摄像头)
- SQLServer 错误 5515 无法打开 FILESTREAM 文件的容器目录“%.*ls”。 操作系统返回 Windows 状态代码 0x%x。 故障 处理 修复 支持远程
- Windows与Linux远程连接:实现跨平台无缝通讯(windows远程连接linux)
- 在Windows与Linux之间传输文件(windows向linux传文件)
- 在windows 中无效Oracle Preferences Invalid on Windows Platform(oracle首选项)
- Windows 11 Win10 下载
- Redis拥抱中文:强大的中文API(redis中文api)
- Windows与Linux的区别 – 深入比较两个操作系统(windows和linux区别)
- 微软已开发首个中国政府专用 Windows 10
- 如何在Linux系统中安装和运行Windows 7?(linux中win7)
- 和windows简单实用:同时装双系统Linux和Windows(电脑装双系统linux)
- 深入了解Linux文件API,掌握Linux文件操作技巧(linux文件api)
- 切换双系统:Linux与Windows的交互(linux和windows双系统)
- Windows和Linux双系统:把两个世界都拥有(windows和linux双系统)
- Linux轻松移植文件至Windows(从linux下载文件到windows)
- MySQL C语言API应用注意事项(mysqlc语言api)
- 简易Redis操作开启通用API之旅(redis 通用api)
- 优化红色闪电 API优化加快网站速度(redis 网站api)
- windows环境下memcache配置方法详细篇
- windows下安装pythonparamiko模块的代码
- windows命令行中java和javac、javap使用详解(java编译命令)
- Windows下MongoDB配置用户权限实例