• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            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差異還是很大的,所以頭文件對此做了一個橋接,以下為頭文件的代碼:


            #ifndef __SkinsbHelper_H__
            #define __SkinsbHelper_H__


            // 包含頭文件
            #include "detours.h"
            #include 
            "skinsb.h"


            #if defined(_DEBUG)
                #pragma comment(lib, 
            "skinsb.lib")
                #pragma comment(lib, 
            "detours.lib")
            #else
                #pragma comment(lib, 
            "skinsb.lib")
                #pragma comment(lib, 
            "detours.lib")
            #endif


            //////////////////////////////////////////////////////////////////////////
            // 申明鉤子
            //////////////////////////////////////////////////////////////////////////
            #if (DETOURS_VERSION >= 20100)
                
            int (WINAPI* SetScrollInfoT) (HWND, int, LPCSCROLLINFO, BOOL) = SetScrollInfo;
                BOOL (WINAPI
            * GetScrollInfoT) (HWND, int, LPSCROLLINFO) = GetScrollInfo;
                
            int (WINAPI* SetScrollPosT) (HWND, intint, BOOL) = SetScrollPos;
                
            int (WINAPI* GetScrollPosT) (HWND, int= GetScrollPos;
                BOOL (WINAPI
            * GetScrollRangeT) (HWND, int, LPINT, LPINT) = GetScrollRange;
                BOOL (WINAPI
            * SetScrollRangeT) (HWND, intintint, BOOL) = SetScrollRange;
                BOOL (WINAPI
            * ShowScrollBarT) (HWND, int, BOOL) = ShowScrollBar;
                BOOL (WINAPI
            * EnableScrollBarT) (HWND, UINT, UINT) = EnableScrollBar;
            #else
                DETOUR_TRAMPOLINE(
            int   WINAPI SetScrollInfoT(HWND, int, LPCSCROLLINFO, BOOL), SetScrollInfo)
                DETOUR_TRAMPOLINE(BOOL  WINAPI GetScrollInfoT(HWND, 
            int, LPSCROLLINFO), GetScrollInfo)
                DETOUR_TRAMPOLINE(
            int   WINAPI SetScrollPosT(HWND, intint, BOOL), SetScrollPos)
                DETOUR_TRAMPOLINE(
            int   WINAPI GetScrollPosT(HWND, int), GetScrollPos)
                DETOUR_TRAMPOLINE(BOOL  WINAPI GetScrollRangeT(HWND, 
            int, LPINT, LPINT), GetScrollRange)
                DETOUR_TRAMPOLINE(BOOL  WINAPI SetScrollRangeT(HWND, 
            intintint, BOOL), SetScrollRange)
                DETOUR_TRAMPOLINE(BOOL  WINAPI ShowScrollBarT(HWND, 
            int, BOOL), ShowScrollBar)
                DETOUR_TRAMPOLINE(BOOL  WINAPI EnableScrollBarT(HWND, UINT, UINT), EnableScrollBar)
            #endif


            int WINAPI SetScrollInfoD(HWND hwnd, int fnBar, LPCSCROLLINFO lpsi, BOOL bRedraw)
            {
                
            if( SkinSB_IsValid(hwnd) )
                    
            return SkinSB_SetScrollInfo(hwnd, fnBar, lpsi, bRedraw);
                
            else
                    
            return SetScrollInfoT(hwnd, fnBar, lpsi, bRedraw);
            }


            BOOL WINAPI GetScrollInfoD(HWND hwnd, 
            int fnBar, LPSCROLLINFO lpsi)
            {
                
            if( SkinSB_IsValid(hwnd) )
                    
            return SkinSB_GetScrollInfo(hwnd, fnBar, lpsi);
                
            else
                    
            return GetScrollInfoT(hwnd, fnBar, lpsi);
            }


            int WINAPI SetScrollPosD(HWND hwnd, int nBar, int nPos, BOOL bRedraw)
            {
                
            if( SkinSB_IsValid(hwnd) )
                    
            return SkinSB_SetScrollPos(hwnd, nBar, nPos, bRedraw);
                
            else
                    
            return SetScrollPosT(hwnd, nBar, nPos, bRedraw);
            }


            int WINAPI GetScrollPosD(HWND hwnd, int nBar)
            {
                
            if( SkinSB_IsValid(hwnd) )
                    
            return SkinSB_GetScrollPos(hwnd, nBar);
                
            else
                    
            return GetScrollPosT(hwnd, nBar);
            }


            BOOL WINAPI SetScrollRangeD(HWND hwnd, 
            int nBar, int nMinPos, int nMaxPos, BOOL bRedraw)
            {
                
            if( SkinSB_IsValid(hwnd) )
                    
            return SkinSB_SetScrollRange(hwnd, nBar, nMinPos, nMaxPos, bRedraw);
                
            else
                    
            return SetScrollRangeT(hwnd, nBar, nMinPos, nMaxPos, bRedraw);
            }


            BOOL WINAPI GetScrollRangeD(HWND hwnd, 
            int nBar, LPINT lpMinPos, LPINT lpMaxPos)
            {
                
            if( SkinSB_IsValid(hwnd) )
                    
            return SkinSB_GetScrollRange(hwnd, nBar, lpMinPos, lpMaxPos);
                
            else
                    
            return GetScrollRangeT(hwnd, nBar, lpMinPos, lpMaxPos);
            }


            BOOL WINAPI ShowScrollBarD(HWND hwnd, 
            int nBar, BOOL bShow)
            {
                
            if( SkinSB_IsValid(hwnd) )
                    
            return SkinSB_ShowScrollBar(hwnd, nBar, bShow);
                
            else
                    
            return ShowScrollBarT(hwnd, nBar, bShow);
            }


            BOOL WINAPI EnableScrollBarD(HWND hwnd, UINT wSBflags, UINT wArrows)
            {
                
            if( SkinSB_IsValid(hwnd) )
                    
            return SkinSB_EnableScrollBar(hwnd, wSBflags, wArrows);
                
            else
                    
            return EnableScrollBarT(hwnd, wSBflags, wArrows);
            }



            //////////////////////////////////////////////////////////////////////////
            /// 注冊鉤子
            //////////////////////////////////////////////////////////////////////////

            LONG RegisterSkinSB(VOID)
            {
            #if (DETOURS_VERSION >= 20100)
                DetourTransactionBegin();
                DetourUpdateThread(GetCurrentThread());
                
            // 加載鉤子
                ::DetourAttach(&(PVOID&)SetScrollInfoT, SetScrollInfoD);
                ::DetourAttach(
            &(PVOID&)GetScrollInfoT, GetScrollInfoD);
                ::DetourAttach(
            &(PVOID&)SetScrollPosT, SetScrollPosD);
                ::DetourAttach(
            &(PVOID&)GetScrollPosT, GetScrollPosD);
                ::DetourAttach(
            &(PVOID&)SetScrollRangeT, SetScrollRangeD);
                ::DetourAttach(
            &(PVOID&)GetScrollRangeT, GetScrollRangeD);
                ::DetourAttach(
            &(PVOID&)ShowScrollBarT, ShowScrollBarD);
                ::DetourAttach(
            &(PVOID&)EnableScrollBarT, EnableScrollBarD);
                
            return DetourTransactionCommit();
            #else
                ::DetourFunctionWithTrampoline((PBYTE)SetScrollInfoT, (PBYTE)SetScrollInfoD);
                ::DetourFunctionWithTrampoline((PBYTE)GetScrollInfoT, (PBYTE)GetScrollInfoD);
                ::DetourFunctionWithTrampoline((PBYTE)SetScrollPosT, (PBYTE)SetScrollPosD);
                ::DetourFunctionWithTrampoline((PBYTE)GetScrollPosT, (PBYTE)GetScrollPosD);
                ::DetourFunctionWithTrampoline((PBYTE)SetScrollRangeT, (PBYTE)SetScrollRangeD);
                ::DetourFunctionWithTrampoline((PBYTE)GetScrollRangeT, (PBYTE)GetScrollRangeD);
                ::DetourFunctionWithTrampoline((PBYTE)ShowScrollBarT, (PBYTE)ShowScrollBarD);
                ::DetourFunctionWithTrampoline((PBYTE)EnableScrollBarT, (PBYTE)EnableScrollBarD);
                
            return 1;
            #endif
            }



            //////////////////////////////////////////////////////////////////////////
            /// 注銷鉤子
            //////////////////////////////////////////////////////////////////////////

            LONG UnRegisterSkinSB(VOID)
            {
            #if (DETOURS_VERSION >= 20100)    
                
            // 卸載鉤子
                ::DetourDetach(&(PVOID&)SetScrollInfoT, SetScrollInfoD);
                ::DetourDetach(
            &(PVOID&)GetScrollInfoT, GetScrollInfoD);
                ::DetourDetach(
            &(PVOID&)SetScrollPosT, SetScrollPosD);
                ::DetourDetach(
            &(PVOID&)GetScrollPosT, GetScrollPosD);
                ::DetourDetach(
            &(PVOID&)SetScrollRangeT, SetScrollRangeD);
                ::DetourDetach(
            &(PVOID&)GetScrollRangeT, GetScrollRangeD);
                ::DetourDetach(
            &(PVOID&)ShowScrollBarT, ShowScrollBarD);
                ::DetourDetach(
            &(PVOID&)EnableScrollBarT, EnableScrollBarD);
            #else
                ::DetourRemove((PBYTE)SetScrollInfoT, (PBYTE)SetScrollInfoD);
                ::DetourRemove((PBYTE)SetScrollPosT, (PBYTE)SetScrollPosD);
                ::DetourRemove((PBYTE)GetScrollInfoT, (PBYTE)GetScrollInfoD);
                ::DetourRemove((PBYTE)GetScrollPosT, (PBYTE)GetScrollPosD);
                ::DetourRemove((PBYTE)SetScrollRangeT, (PBYTE)SetScrollRangeD);
                ::DetourRemove((PBYTE)GetScrollRangeT, (PBYTE)GetScrollRangeD);
                ::DetourRemove((PBYTE)ShowScrollBarT, (PBYTE)ShowScrollBarD);
                ::DetourRemove((PBYTE)EnableScrollBarT, (PBYTE)EnableScrollBarD);
            #endif
                
            return 1;
            }



            #endif

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

            posted on 2010-10-28 14:34 楊粼波 閱讀(1211) 評論(0)  編輯 收藏 引用

            久久天堂AV综合合色蜜桃网| 久久狠狠色狠狠色综合| 久久精品亚洲男人的天堂| 久久精品这里只有精99品| 国产69精品久久久久久人妻精品| 性欧美大战久久久久久久久| 久久99精品久久久久久hb无码| 久久免费视频网站| 久久久久久国产a免费观看黄色大片 | 久久综合给合久久狠狠狠97色| 久久91综合国产91久久精品| 亚洲精品无码久久久久AV麻豆| 久久久久久无码Av成人影院| 久久免费精品一区二区| 亚洲伊人久久成综合人影院| 久久久精品2019免费观看| 久久精品国产第一区二区| 午夜天堂av天堂久久久| 久久一区二区三区99| 亚洲国产精品久久久久久| 伊人久久大香线蕉精品不卡 | 人妻无码精品久久亚瑟影视| 亚洲精品无码久久久久去q | 国产欧美久久久精品| 精品国产乱码久久久久久人妻| 青青草国产精品久久久久| 久久夜色精品国产欧美乱| 日日狠狠久久偷偷色综合免费| 久久精品国产福利国产秒| 久久人人爽人人爽人人AV | 欧美久久久久久| 国产精品日韩深夜福利久久| 久久久精品人妻一区二区三区蜜桃| 2021最新久久久视精品爱 | 无码人妻久久久一区二区三区| 亚洲伊人久久综合中文成人网| 91精品免费久久久久久久久| 久久久久久狠狠丁香| 国产精品久久一区二区三区 | 欧美一区二区三区久久综| 久久午夜福利无码1000合集|