- 论坛徽章:
- 0
|
网络浏览器插件的高手请进。。。
- /* 利用BHO做IE插件,这个挺有意思的,给大家分享 */
- #define WAIT_TIME 2000
- #define PictureH 109
- #define PictureW 405
- static UINT iTimeID = 0;
- static int WINAPI ShowSplash(HINSTANCE hInstance, UINT iBgBmpHeight, UINT iBgBmpWidth);
- static LRESULT CALLBACK SplashProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
- extern "C"
- BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
- {
- TCHAR pszLoader[MAX_PATH];
- LPSTR pstrFileName = NULL;
- if (dwReason == DLL_PROCESS_ATTACH) {
- // 得到当前调用者的名字,如:C:\Program Files\Internet Explorer\IEXPLORE.EXE
- GetModuleFileName(NULL, pszLoader, MAX_PATH);
- pstrFileName = strrchr(pszLoader, '\\');
- if (pstrFileName == NULL) {
- // 出错处理
- // 空指针
- return FALSE;
- }
- pstrFileName++;
-
- // 判断是否是 IE,是则加载启动画面
- if (lstrcmpi(pstrFileName, TEXT("IEXPLORE.EXE")) == NULL) {
- // 加载启动画面
- ShowSplash(hInstance, PictureH, PictureW);
- }
-
- _Module.Init(ObjectMap, hInstance, &LIBID_IESTARTLib);
- DisableThreadLibraryCalls(hInstance);
- }
- else if (dwReason == DLL_PROCESS_DETACH) {
- _Module.Term();
- }
- return TRUE; // ok
- }
- // IE 启动画面显示
- int WINAPI ShowSplash(HINSTANCE hInstance, UINT iBgBmpHeight, UINT iBgBmpWidth)
- {
- HWND hSplashWnd = NULL;
- MSG stMsg;
- WNDCLASSEX stWndClassEx;
- TCHAR szClassName[] = TEXT("LeXX_Splash_Wnd");
- HCURSOR hMouseCursor =NULL;
- HBRUSH hBgBrush = NULL;
- HBITMAP hBgBmp = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_SPLASH));
- if (hBgBmp == NULL) {
- // 出错处理
- // 导出位图出错
- return 0;
- }
-
- hBgBrush = CreatePatternBrush(hBgBmp);
- if (hBgBrush == NULL) {
- // 出错处理
- // 创建画刷出错
- return 0;
- }
- hMouseCursor = LoadCursor(NULL, IDC_ARROW);
- if (hMouseCursor == NULL) {
- // 出错处理
- // 导出光标错误
- return 0;
- }
-
- stWndClassEx.cbSize = sizeof(WNDCLASSEX);
- stWndClassEx.style = CS_HREDRAW | CS_VREDRAW;
- stWndClassEx.lpfnWndProc = SplashProc;
- stWndClassEx.cbClsExtra = NULL;
- stWndClassEx.cbWndExtra = NULL;
- stWndClassEx.hInstance = hInstance;
- stWndClassEx.hbrBackground = hBgBrush;
- stWndClassEx.lpszMenuName = NULL;
- stWndClassEx.lpszClassName = szClassName;
- stWndClassEx.hIcon = NULL;
- stWndClassEx.hIconSm = NULL;
- stWndClassEx.hCursor = hMouseCursor;
- if (!RegisterClassEx(&stWndClassEx)) {
- // 出错处理
- // 无法注册窗口类
- return 0;
- }
-
- // 使启动画面加载在屏幕正中
- int iWndLeft = (GetSystemMetrics(SM_CXSCREEN) - iBgBmpWidth) / 2;
- int iWndTop = (GetSystemMetrics(SM_CYSCREEN) - iBgBmpHeight) / 2;
-
- hSplashWnd = CreateWindowEx(WS_EX_LEFT, szClassName, TEXT("Loading..."),
- WS_POPUP, iWndLeft, iWndTop, iBgBmpWidth, iBgBmpHeight,
- NULL,NULL,hInstance,NULL);
- if (hSplashWnd == NULL) {
- // 出错处理
- // 无法创建窗口
- return 0;
- }
- ShowWindow(hSplashWnd, SW_SHOWNORMAL);
- UpdateWindow(hSplashWnd);
-
- // 消息循环
- while (GetMessage(&stMsg, NULL, 0, 0)) {
- TranslateMessage(&stMsg);
- DispatchMessage(&stMsg);
- }
- return stMsg.wParam;
- }
- LRESULT CALLBACK SplashProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- switch (uMsg) {
- case WM_CREATE:
- // 定时器
- iTimeID = SetTimer(hWnd, 1, WAIT_TIME,NULL);
- return 0;
- case WM_TIMER:
- KillTimer(hWnd, iTimeID);
- DestroyWindow(hWnd);
- return 0;
- case WM_DESTROY:
- PostQuitMessage(NULL);
- return 0;
- }
- return DefWindowProc(hWnd, uMsg, wParam, lParam);
- }
- //(注意其中 {EA1EFEA2-1051-4384-A81E-74DE2167EEDF} 只是笔者的 CLSID ,自己写时需做相应的改变):
- HKLM
- {
- SOFTWARE
- {
- Microsoft
- {
- Windows
- {
- CurrentVersion
- {
- Explorer
- {
- 'Browser Helper Objects'
- {
- {EA1EFEA2-1051-4384-A81E-74DE2167EEDF}
- }
- }
- }
- }
- }
- }
- }
复制代码 |
|