当前位置: 首页 > news >正文

SkinSB皮肤滚动条库的一个帮助头文件

从哪里获取到SkinSB?
    你可以从作者的博客里面获取到相关信息:http://blog.csdn.net/mynamelj/archive/2009/02/16/3895585.aspx

从哪里获取Detours?
    它依赖着微软的一个很暴力的库Detours,可以从微软的网站上获取到:http://research.microsoft.com/en-us/projects/detours/


官方网站上Detours最新版本是2.1,而SkinSB原生用的是1.5的版本的,这两个版本的API差异还是很大的,所以头文件对此做了一个桥接,以下为头文件的代码:
None.gif
None.gif
None.gif#ifndef __SkinsbHelper_H__
None.gif #define __SkinsbHelper_H__
None.gif
None.gif
None.gif //  包含头文件
None.gif
#include "detours.h"
None.gif#include "skinsb.h"
None.gif
None.gif
None.gif #if defined(_DEBUG)
None.gif    #pragma comment(lib, "skinsb.lib")
None.gif    #pragma comment(lib, "detours.lib")
None.gif #else
None.gif    #pragma comment(lib, "skinsb.lib")
None.gif    #pragma comment(lib, "detours.lib")
None.gif #endif
None.gif
None.gif
ExpandedBlockStart.gif //
None.gif //  申明钩子
ExpandedBlockStart.gif
//
None.gif #if (DETOURS_VERSION >= 20100)
None.gif     int (WINAPI* SetScrollInfoT) (HWND,  int, LPCSCROLLINFO, BOOL) = SetScrollInfo;
None.gif    BOOL (WINAPI* GetScrollInfoT) (HWND,  int, LPSCROLLINFO) = GetScrollInfo;
None.gif     int (WINAPI* SetScrollPosT) (HWND,  intint, BOOL) = SetScrollPos;
None.gif     int (WINAPI* GetScrollPosT) (HWND,  int) = GetScrollPos;
None.gif    BOOL (WINAPI* GetScrollRangeT) (HWND,  int, LPINT, LPINT) = GetScrollRange;
None.gif    BOOL (WINAPI* SetScrollRangeT) (HWND,  intintint, BOOL) = SetScrollRange;
None.gif    BOOL (WINAPI* ShowScrollBarT) (HWND,  int, BOOL) = ShowScrollBar;
None.gif    BOOL (WINAPI* EnableScrollBarT) (HWND, UINT, UINT) = EnableScrollBar;
None.gif #else
None.gif    DETOUR_TRAMPOLINE( int   WINAPI SetScrollInfoT(HWND,  int, LPCSCROLLINFO, BOOL), SetScrollInfo)
None.gif    DETOUR_TRAMPOLINE(BOOL  WINAPI GetScrollInfoT(HWND,  int, LPSCROLLINFO), GetScrollInfo)
None.gif    DETOUR_TRAMPOLINE( int   WINAPI SetScrollPosT(HWND,  intint, BOOL), SetScrollPos)
None.gif    DETOUR_TRAMPOLINE( int   WINAPI GetScrollPosT(HWND,  int), GetScrollPos)
None.gif    DETOUR_TRAMPOLINE(BOOL  WINAPI GetScrollRangeT(HWND,  int, LPINT, LPINT), GetScrollRange)
None.gif    DETOUR_TRAMPOLINE(BOOL  WINAPI SetScrollRangeT(HWND,  intintint, BOOL), SetScrollRange)
None.gif    DETOUR_TRAMPOLINE(BOOL  WINAPI ShowScrollBarT(HWND,  int, BOOL), ShowScrollBar)
None.gif    DETOUR_TRAMPOLINE(BOOL  WINAPI EnableScrollBarT(HWND, UINT, UINT), EnableScrollBar)
None.gif #endif
None.gif
None.gif
None.gif int WINAPI SetScrollInfoD(HWND hwnd,  int fnBar, LPCSCROLLINFO lpsi, BOOL bRedraw)
ExpandedBlockStart.gif {
InBlock.gif    if( SkinSB_IsValid(hwnd) )
InBlock.gif        return SkinSB_SetScrollInfo(hwnd, fnBar, lpsi, bRedraw);
InBlock.gif    else
InBlock.gif        return SetScrollInfoT(hwnd, fnBar, lpsi, bRedraw);
ExpandedBlockEnd.gif}
None.gif
None.gifBOOL WINAPI GetScrollInfoD(HWND hwnd,  int fnBar, LPSCROLLINFO lpsi)
ExpandedBlockStart.gif {
InBlock.gif    if( SkinSB_IsValid(hwnd) )
InBlock.gif        return SkinSB_GetScrollInfo(hwnd, fnBar, lpsi);
InBlock.gif    else
InBlock.gif        return GetScrollInfoT(hwnd, fnBar, lpsi);
ExpandedBlockEnd.gif}
None.gif
None.gif int WINAPI SetScrollPosD(HWND hwnd,  int nBar,  int nPos, BOOL bRedraw)
ExpandedBlockStart.gif {
InBlock.gif    if( SkinSB_IsValid(hwnd) )
InBlock.gif        return SkinSB_SetScrollPos(hwnd, nBar, nPos, bRedraw);
InBlock.gif    else
InBlock.gif        return SetScrollPosT(hwnd, nBar, nPos, bRedraw);
ExpandedBlockEnd.gif}
None.gif
None.gif int WINAPI GetScrollPosD(HWND hwnd,  int nBar)
ExpandedBlockStart.gif {
InBlock.gif    if( SkinSB_IsValid(hwnd) )
InBlock.gif        return SkinSB_GetScrollPos(hwnd, nBar);
InBlock.gif    else
InBlock.gif        return GetScrollPosT(hwnd, nBar);
ExpandedBlockEnd.gif}
None.gif
None.gifBOOL WINAPI SetScrollRangeD(HWND hwnd,  int nBar,  int nMinPos,  int nMaxPos, BOOL bRedraw)
ExpandedBlockStart.gif {
InBlock.gif    if( SkinSB_IsValid(hwnd) )
InBlock.gif        return SkinSB_SetScrollRange(hwnd, nBar, nMinPos, nMaxPos, bRedraw);
InBlock.gif    else
InBlock.gif        return SetScrollRangeT(hwnd, nBar, nMinPos, nMaxPos, bRedraw);
ExpandedBlockEnd.gif}
None.gif
None.gifBOOL WINAPI GetScrollRangeD(HWND hwnd,  int nBar, LPINT lpMinPos, LPINT lpMaxPos)
ExpandedBlockStart.gif {
InBlock.gif    if( SkinSB_IsValid(hwnd) )
InBlock.gif        return SkinSB_GetScrollRange(hwnd, nBar, lpMinPos, lpMaxPos);
InBlock.gif    else
InBlock.gif        return GetScrollRangeT(hwnd, nBar, lpMinPos, lpMaxPos);
ExpandedBlockEnd.gif}
None.gif
None.gifBOOL WINAPI ShowScrollBarD(HWND hwnd,  int nBar, BOOL bShow)
ExpandedBlockStart.gif {
InBlock.gif    if( SkinSB_IsValid(hwnd) )
InBlock.gif        return SkinSB_ShowScrollBar(hwnd, nBar, bShow);
InBlock.gif    else
InBlock.gif        return ShowScrollBarT(hwnd, nBar, bShow);
ExpandedBlockEnd.gif}
None.gif
None.gifBOOL WINAPI EnableScrollBarD(HWND hwnd, UINT wSBflags, UINT wArrows)
ExpandedBlockStart.gif {
InBlock.gif    if( SkinSB_IsValid(hwnd) )
InBlock.gif        return SkinSB_EnableScrollBar(hwnd, wSBflags, wArrows);
InBlock.gif    else
InBlock.gif        return EnableScrollBarT(hwnd, wSBflags, wArrows);
ExpandedBlockEnd.gif}
None.gif
None.gif
ExpandedBlockStart.gif //
InBlock.gif
/// 注册钩子
ExpandedBlockEnd.gif
//
None.gifLONG RegisterSkinSB(VOID)
ExpandedBlockStart.gif {
InBlock.gif#if (DETOURS_VERSION >= 20100)
InBlock.gif    DetourTransactionBegin();
InBlock.gif    DetourUpdateThread(GetCurrentThread());
InBlock.gif    // 加载钩子
InBlock.gif
    ::DetourAttach(&(PVOID&)SetScrollInfoT, SetScrollInfoD);
InBlock.gif    ::DetourAttach(&(PVOID&)GetScrollInfoT, GetScrollInfoD);
InBlock.gif    ::DetourAttach(&(PVOID&)SetScrollPosT, SetScrollPosD);
InBlock.gif    ::DetourAttach(&(PVOID&)GetScrollPosT, GetScrollPosD);
InBlock.gif    ::DetourAttach(&(PVOID&)SetScrollRangeT, SetScrollRangeD);
InBlock.gif    ::DetourAttach(&(PVOID&)GetScrollRangeT, GetScrollRangeD);
InBlock.gif    ::DetourAttach(&(PVOID&)ShowScrollBarT, ShowScrollBarD);
InBlock.gif    ::DetourAttach(&(PVOID&)EnableScrollBarT, EnableScrollBarD);
InBlock.gif    return DetourTransactionCommit();
InBlock.gif#else
InBlock.gif    ::DetourFunctionWithTrampoline((PBYTE)SetScrollInfoT, (PBYTE)SetScrollInfoD);
InBlock.gif    ::DetourFunctionWithTrampoline((PBYTE)GetScrollInfoT, (PBYTE)GetScrollInfoD);
InBlock.gif    ::DetourFunctionWithTrampoline((PBYTE)SetScrollPosT, (PBYTE)SetScrollPosD);
InBlock.gif    ::DetourFunctionWithTrampoline((PBYTE)GetScrollPosT, (PBYTE)GetScrollPosD);
InBlock.gif    ::DetourFunctionWithTrampoline((PBYTE)SetScrollRangeT, (PBYTE)SetScrollRangeD);
InBlock.gif    ::DetourFunctionWithTrampoline((PBYTE)GetScrollRangeT, (PBYTE)GetScrollRangeD);
InBlock.gif    ::DetourFunctionWithTrampoline((PBYTE)ShowScrollBarT, (PBYTE)ShowScrollBarD);
InBlock.gif    ::DetourFunctionWithTrampoline((PBYTE)EnableScrollBarT, (PBYTE)EnableScrollBarD);
InBlock.gif    return 1;
InBlock.gif#endif
ExpandedBlockEnd.gif}
None.gif
None.gif
ExpandedBlockStart.gif //
InBlock.gif
/// 注销钩子
ExpandedBlockEnd.gif
//
None.gifLONG UnRegisterSkinSB(VOID)
ExpandedBlockStart.gif {
InBlock.gif#if (DETOURS_VERSION >= 20100)    
InBlock.gif    // 卸载钩子
InBlock.gif
    ::DetourDetach(&(PVOID&)SetScrollInfoT, SetScrollInfoD);
InBlock.gif    ::DetourDetach(&(PVOID&)GetScrollInfoT, GetScrollInfoD);
InBlock.gif    ::DetourDetach(&(PVOID&)SetScrollPosT, SetScrollPosD);
InBlock.gif    ::DetourDetach(&(PVOID&)GetScrollPosT, GetScrollPosD);
InBlock.gif    ::DetourDetach(&(PVOID&)SetScrollRangeT, SetScrollRangeD);
InBlock.gif    ::DetourDetach(&(PVOID&)GetScrollRangeT, GetScrollRangeD);
InBlock.gif    ::DetourDetach(&(PVOID&)ShowScrollBarT, ShowScrollBarD);
InBlock.gif    ::DetourDetach(&(PVOID&)EnableScrollBarT, EnableScrollBarD);
InBlock.gif#else
InBlock.gif    ::DetourRemove((PBYTE)SetScrollInfoT, (PBYTE)SetScrollInfoD);
InBlock.gif    ::DetourRemove((PBYTE)SetScrollPosT, (PBYTE)SetScrollPosD);
InBlock.gif    ::DetourRemove((PBYTE)GetScrollInfoT, (PBYTE)GetScrollInfoD);
InBlock.gif    ::DetourRemove((PBYTE)GetScrollPosT, (PBYTE)GetScrollPosD);
InBlock.gif    ::DetourRemove((PBYTE)SetScrollRangeT, (PBYTE)SetScrollRangeD);
InBlock.gif    ::DetourRemove((PBYTE)GetScrollRangeT, (PBYTE)GetScrollRangeD);
InBlock.gif    ::DetourRemove((PBYTE)ShowScrollBarT, (PBYTE)ShowScrollBarD);
InBlock.gif    ::DetourRemove((PBYTE)EnableScrollBarT, (PBYTE)EnableScrollBarD);
InBlock.gif#endif
InBlock.gif    return 1;
ExpandedBlockEnd.gif}
None.gif
None.gif
None.gif #endif
None.gif

在InitInstance()里面使用:RegisterSkinSB(),
在RegisterSkinSB中使用;UnRegisterSkinSB().

相关文章:

  • xmanager运行报错:bash: /usr/bin/xterm: No such file or directory
  • Android 音视频开发入门指南
  • 8.html表格相关的标记9.html表格实战《简单的网页布局》
  • 如何添加mysql到环境变量
  • 24、C#:按钮的属性和事件
  • c++ 软件下载 Dev cpp下载
  • 字符流、字节流、二进制及其在HTTP协议传输
  • Rxjs基础--Subject
  • Uber 机器学习平台 — 米开朗基罗
  • 使用forever让node.js持久运行
  • 系统安装
  • 如何开发webpack loader
  • 数据收集利器 cAdvisor - 每天5分钟玩转 Docker 容器技术(82)
  • Linux中禁用THP(Transparent Huge Pages)
  • Oracle无法收集AWR报错ORA-13516
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 11111111
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • AngularJS指令开发(1)——参数详解
  • java多线程
  • MySQL主从复制读写分离及奇怪的问题
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 彻底搞懂浏览器Event-loop
  • 汉诺塔算法
  • 两列自适应布局方案整理
  • 数组大概知多少
  • 思考 CSS 架构
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • Prometheus VS InfluxDB
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​渐进式Web应用PWA的未来
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • $refs 、$nextTic、动态组件、name的使用
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .Net CF下精确的计时器
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET Framework杂记
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .Net小白的大学四年,内含面经
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @GetMapping和@RequestMapping的区别
  • [Angular] 笔记 8:list/detail 页面以及@Input
  • [Assignment] C++1
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)
  • [C]整形提升(转载)
  • [CISCN2019 华北赛区 Day1 Web2]ikun
  • [Java][Android][Process] 暴力的服务能够解决一切,暴力的方式运行命令行语句