⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 怎样隐藏应用程序的任务条图标.txt

📁 电子书籍,里面有丰富的文章和精神的营养,
💻 TXT
字号:
怎样隐藏应用程序的任务条图标 


首先,请看看这些术语。系统托盘是一个在任务条右角的小方框,在托盘了应用程序可以显示小图标。任务条是可以在屏幕上伸展的工具栏。它就是程序图标所在的位置。想隐藏程序的任务条图标,你可以应用ShowWindow函数并传给它Application->Handle窗口句柄。

    ShowWindow(Application->Handle, SW_HIDE);
若想让任务条图标再出现,只需将SW_HIDE改为SW_SHOW。

    ShowWindow(Application->Handle, SW_SHOW);
注: 你可以设置主窗口的Visible属性为false来隐藏它。

注: 通过ShowWindow来隐藏窗口的任务条图标是不持久的。某些动作会使任务条图标重现。你可以将隐藏的应用程序窗口设为Tool Window来移走程序的任务条图标而避免它再次出现。Tool windows永远不会有任务条图标。 使应用程序窗口成为一个Tool Window有一个副作用:当用户按下Alt-TAB时它将不在程序列表中出现。你可以调用API函数GetWindowLong和SetWindowLong来使应用程序窗口成为一个Tool Window。

    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
 
        DWORD dwExStyle = GetWindowLong(Application->Handle, GWL_EXSTYLE);
        dwExStyle |= WS_EX_TOOLWINDOW;
        SetWindowLong(Application->Handle, GWL_EXSTYLE, dwExStyle);
 
        try
        {
             Application->Initialize();
             Application->CreateForm(__classid(TForm1), &Form1);
             Application->Run();
        }
        catch (Exception &exception)
        {
             Application->ShowException(&exception);
        }
        return 0;
    }
 



如何截获API函数 


我曾经写过一个截获MessageBoxW的程序,可以看看,或许对你有一些帮助. 
该程序是基于HOOK原理,主要是将自己的函数放到目标PROCESS的地址空间,这里是使用HOOK实现.首先建立一个MOUSE的HOOK程序,然后在全局鼠标HOOK的DLL中做截获动作,可以在PROCESS_ATTACH时做,也可以在鼠标的HOOK链函数中做. 
建立全局HOOK我就不说了,可以在网上很多地方看到.主要是截获动作.我是通过PE格式(使用IMAGE)改变API函数在调用时的地址.DLL部分参考如下代码: 
static int WINAPI MyMessageBoxW(HWND hWnd , LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)//自己的MessageBoxW函数 
{return MessageBox(hWnd, "TNT"/*lpText*/, "TNT"/*lpCaption*/, uType); 
} 
我定义了一个结构 
typedef struct tag_HOOKAPI 
{ 
LPCSTR szFunc;//待HOOK的API函数名 
PROC pNewProc;//新的函数指针 
PROC pOldProc;//老的函数指针 
}HOOKAPI, *LPHOOKAPI; 

extern "C" __declspec(dllexport)PIMAGE_IMPORT_DESCRIPTOR GetNamedImportDescriptor(HMODULE hModule, LPCSTR szImportMod) 
{ 
//首先是DOS头 
PIMAGE_DOS_HEADER pDOSHeader = (PIMAGE_DOS_HEADER) hModule; 
if(pDOSHeader->e_magic != IMAGE_DOS_SIGNATURE) return NULL; 
PIMAGE_NT_HEADERS pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pDOSHeader + (DWORD)(pDOSHeader->e_lfanew)); 
if(pNTHeader->Signature != IMAGE_NT_SIGNATURE) return NULL; 
//如果没有Import部分,返回失败 
if(pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress == 0) 
return NULL; 
//取Import部分 
PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR) 
((DWORD)pDOSHeader + (DWORD)(pNTHeader->OptionalHeader. 
DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress)); 
//寻找与szImportMod相配部分 
while (pImportDesc->Name) 
{ 
PSTR szCurrMod = (PSTR)((DWORD)pDOSHeader + (DWORD)(pImportDesc->Name)); 
if (stricmp(szCurrMod, szImportMod) == 0) 
break; //找到 
pImportDesc++; 
} 
if(pImportDesc->Name == NULL) return NULL; 
return pImportDesc; 
} 

extern "C" __declspec(dllexport) HookAPIByName(HMODULE hModule/*被HOOK的目标进程MODULE*/, LPCSTR szImportMod/*如GDI32.DLL*/,LPHOOKAPI pHookApi/*指定函数名,如"MessageBoxW"*/) 
{ 
PIMAGE_IMPORT_DESCRIPTOR pImportDesc = 
GetNamedImportDescriptor(hModule, szImportMod); 
if (pImportDesc == NULL) 
return FALSE; //需要改换的API不能取到正确描PIMAGE_THUNK_DATA pOrigThunk = (PIMAGE_THUNK_DATA)((DWORD)hModule + (DWORD)(pImportDesc->OriginalFirstThunk)); 
PIMAGE_THUNK_DATA pRealThunk = 
(PIMAGE_THUNK_DATA)((DWORD)hModule + (DWORD)(pImportDesc->FirstThunk)); 
while(pOrigThunk->u1.Function) 
{ 
if((pOrigThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) != IMAGE_ORDINAL_FLAG) 
{ 
PIMAGE_IMPORT_BY_NAME pByName = (PIMAGE_IMPORT_BY_NAME)((DWORD)hModule + (DWORD)(pOrigThunk->u1.AddressOfData)); 
if(pByName->Name[0] == '\0') 
return FALSE; //失败 
if(strcmpi(pHookApi->szFunc, (char*)pByName->Name) == 0) 
{ 
//改变thunk保护属性 
MEMORY_BASIC_INFORMATION mbi_thunk; 
VirtualQuery(pRealThunk, &mbi_thunk, sizeof(MEMORY_BASIC_INFORMATION)); 
VirtualProtect(mbi_thunk.BaseAddress,mbi_thunk.RegionSize, PAGE_READWRITE, &mbi_thunk.Protect); 
//保存原来的API函数指针 
if(pHookApi->pOldProc == NULL) 
pHookApi->pOldProc = (PROC)pRealThunk->u1.Function; 
//改变API函数指针 
pRealThunk->u1.Function = (PDWORD)pHookApi->pNewProc; 
//将thunk保护属性改回来 
DWORD dwOldProtect; 
VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize, 
mbi_thunk.Protect, &dwOldProtect); 
} 
} 
pOrigThunk++; 
pRealThunk++; 
} 
SetLastError(ERROR_SUCCESS); 
return TRUE; 
} 
EXE部分很简单,将该DLL载入,开启鼠标HOOK. 



-------------------------------------------------------------------------------- 

copyright(c) www.vckbase.com 
2000.03.01 

______________________________________ 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -