關於系統任務、進程的編程技巧

+---------+------------+-----------------------------+---+----------+-------+
| 開始按鈕 |運行應用程序1 | 運行應用程序2...             |[<]|托盤通知區域|托盤時鐘|
+---------+------------+-----------------------------+---+----------+-------+

// ============================================
// HackerTools.h : YangTze presents. 07/07/2005
// ============================================

#pragma once

class CHackerTools
{
public:
 CHackerTools(void);
 ~CHackerTools(void);

public:
 // 任務欄
 BOOL TaskbarOnOff( BOOL bFlag );
 // 開始按鈕
 BOOL StartButtonOnOff( BOOL bFlag );
 // 托盤
 BOOL TrayOnOff( BOOL bFlag );
 // 托盤時鐘
 BOOL TrayClockOnOff( BOOL bFlag );
 // 任務欄中運行應用程序
 BOOL AppButtonOnOff( BOOL bFlag );
 // 托盤通知區域
 BOOL NotifyAreaOnOff( BOOL bFlag );
 // 托盤伸縮按鈕
 BOOL TrayExtendedButtonOnOff( BOOL bFlag );
 // 程序管理器
 BOOL ProgramManagerOnOff( BOOL bFlag );
};

// ==============================================
// HackerTools.cpp : YangTze presents. 07/07/2005
// ==============================================

#include "StdAfx.h"
#include ".\hackertools.h"

CHackerTools::CHackerTools(void)
{
}

CHackerTools::~CHackerTools(void)
{
}

// 任務欄
// ------------------------------------------
BOOL CHackerTools::TaskbarOnOff( BOOL bFlag )
{
 HWND hWnd;

 hWnd = ::FindWindow( _T("Shell_TrayWnd"),NULL );
 if( hWnd == NULL ) return FALSE;

 ::ShowWindow( hWnd,bFlag ? SW_SHOW : SW_HIDE );
 ::UpdateWindow( hWnd );

 return TRUE;
}

// 開始按鈕
// ----------------------------------------------
BOOL CHackerTools::StartButtonOnOff( BOOL bFlag )
{
 HWND hWnd;

 hWnd = ::GetDlgItem( ::FindWindow( _T("Shell_TrayWnd"),NULL ),0x130 );
 if( hWnd == NULL ) return FALSE;

 ::ShowWindow( hWnd,bFlag ? SW_SHOW : SW_HIDE );
 ::UpdateWindow( hWnd );

 return TRUE;
}

// 托盤
// ---------------------------------------
BOOL CHackerTools::TrayOnOff( BOOL bFlag )
{
 HWND hWnd;

 hWnd = ::GetDlgItem( ::FindWindow( _T("Shell_TrayWnd"),NULL ),0x12F );
 if( hWnd == NULL ) return FALSE;

 ::ShowWindow( hWnd,bFlag ? SW_SHOW : SW_HIDE );
 ::UpdateWindow( hWnd );

 return TRUE;
}

// 托盤時鐘
// --------------------------------------------
BOOL CHackerTools::TrayClockOnOff( BOOL bFlag )
{
 HWND hWnd;

 hWnd = ::GetDlgItem( ::FindWindow( _T("Shell_TrayWnd"),NULL ),0x12F );
 if( hWnd == NULL ) return FALSE;

 hWnd = ::GetDlgItem( hWnd,0x12F );
 if( hWnd == NULL ) return FALSE;

 ::ShowWindow( hWnd,bFlag ? SW_SHOW : SW_HIDE );
 ::UpdateWindow( hWnd );

 return TRUE;
}

// 任務欄中運行應用程序
// --------------------------------------------
BOOL CHackerTools::AppButtonOnOff( BOOL bFlag )
{
 HWND hWnd;

 hWnd = ::GetDlgItem( ::FindWindow( _T("Shell_TrayWnd"),NULL ),0xA005 );
 {
  HWND hWndSub;
  hWndSub = ::FindWindowEx( hWnd,NULL,_T("MSTaskSwWClass"),_T("運行應用程序") );
  if( hWndSub != NULL )
  {
   hWndSub = ::FindWindowEx( hWndSub,NULL,_T("ToolbarWindow32"),_T("運行應用程序") );
   if( hWndSub != NULL )
   {
    hWnd = hWndSub;
   }
  }
 }
 if( hWnd == NULL ) return FALSE;

 ::ShowWindow( hWnd,bFlag ? SW_SHOW : SW_HIDE );
 ::UpdateWindow( hWnd );

 return TRUE;
}

// 托盤通知區域
// ---------------------------------------------
BOOL CHackerTools::NotifyAreaOnOff( BOOL bFlag )
{
 HWND hWnd;

 hWnd = ::GetDlgItem( ::FindWindow( _T("Shell_TrayWnd"),NULL ),0x12F );
 if( hWnd == NULL ) return FALSE;
 hWnd = ::FindWindowEx( hWnd,NULL,_T("SysPager"),_T("") );
 if( hWnd == NULL ) return FALSE;

 ::ShowWindow( hWnd,bFlag ? SW_SHOW : SW_HIDE );
 ::UpdateWindow( hWnd );

 return TRUE;
}

// 托盤伸縮按鈕
// -----------------------------------------------------
BOOL CHackerTools::TrayExtendedButtonOnOff( BOOL bFlag )
{
 HWND hWnd;

 hWnd = ::GetDlgItem( ::FindWindow( _T("Shell_TrayWnd"),NULL ),0x12F );
 if( hWnd == NULL ) return FALSE;

 hWnd = ::GetDlgItem( hWnd,0x5DE );
 if( hWnd == NULL ) return FALSE;

 ::ShowWindow( hWnd,bFlag ? SW_SHOW : SW_HIDE );
 ::UpdateWindow( hWnd );

 return TRUE;
}

// 程序管理器
// -------------------------------------------------
BOOL CHackerTools::ProgramManagerOnOff( BOOL bFlag )
{
 HWND hWnd;

 hWnd = ::FindWindow( NULL,_T("Program Manager") );
 if( hWnd == NULL ) return FALSE;

 ::SetWindowPos( hWnd,NULL,0,0,0,0,
        bFlag ? SWP_SHOWWINDOW : SWP_HIDEWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER
 );

 return TRUE;
}

關於 被0除 異常的捕獲!
默認情況下,系統屏蔽了浮點數/整數運算時的異常錯誤,並以0或者無窮大表示結果,並不會產生異常。

這些數值計算異常列表如下:

_EM_INVALID

_EM_DENORMAL

_EM_ZERODIVIDE

_EM_OVERFLOW

_EM_UNDERFLOW

_EM_INEXACT

爲了捕獲上述異常,必須使用 _controlfp(...)/_control87(...) 運行庫函數設置相關的屏蔽位,代碼示例如下:

 

// ZeroDivide.cpp : By YangTze!
//

#include "stdafx.h"

#include <WINDOWS.H>
#include <STDIO.H>
#include <FLOAT.H>

void TestFunc()
{
    int i = 888;
    int j = 0;

    __try {
        i = i/j;
    }
    __except( GetExceptionCode() == EXCEPTION_INT_DIVIDE_BY_ZERO ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH ) {
        MessageBox( NULL,"EXCEPTION_INT_DIVIDE_BY_ZERO!","Error!",MB_OK );
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    unsigned int nOldMask;
    unsigned int nNewMask;

    nOldMask = _controlfp( 0,0 );
    nNewMask = ( ( nOldMask & ~_EM_ZERODIVIDE ) | ( _EM_ZERODIVIDE & _MCW_EM ) );
    _controlfp( nNewMask,_MCW_EM );

    TestFunc();

    _controlfp( _CW_DEFAULT, 0xfffff );

    return 0;
}


程序隱藏 之 運行時更改名字
當一個程序正在運行時,Windows 系統是不允許把它刪除的,但在 Windows 2000/XP 中,當一個程序正在運行時,可以將它本身在相同磁盤分區內重命名和移動位置!

試想想:如果我們的程序一運行,就把自己移動位置並且換個名字,此時,Windows 任務管理器還顯示的是原來的名字,嘿嘿,程序不見了(只有你知道哦)...

這種做法有什麼用?嘿嘿,幹壞事唄!

 

#include "stdafx.h"

#include <WINDOWS.H>

int _tmain(int argc, _TCHAR* argv[])
{
 TCHAR szCurName[1024];
 TCHAR szNewName[1024];

 GetModuleFileName( NULL,szCurName,MAX_PATH );
 _tcscpy( szNewName,szCurName );
 _tcsupr( szNewName );
 TCHAR *pPostfix = _tcsstr( szNewName,_T(".EXE") );
 _tcscpy( pPostfix,_T("Renamed.EXE") );
 MoveFile( szCurName,szNewName );

 return 0;
}


彙編的魅力
HelloWorld.ASM

; #########################################################################

      .386
      .model flat, stdcall
      option casemap :none ; case sensitive

; #########################################################################

      include c:\masm32\include\windows.inc
      include c:\masm32\include\user32.inc
      include c:\masm32\include\kernel32.inc

      includelib c:\masm32\lib\user32.lib
      includelib c:\masm32\lib\kernel32.lib

; #########################################################################

      .data
        szHelloWorld db "Hello,World!",0
        szTitle      db "Haha...",0

      .code

start:
      invoke MessageBox,NULL,ADDR szHelloWorld,ADDR szTitle,MB_OK
      invoke ExitProcess,0

end start


附註:隨着各種各樣高級語言開發平臺的百舸爭流,心中某種缺憾卻越來越強烈,有一種浮砂築高臺的感覺。

 

用ITaskbarList接口操縱Windows任務欄程序按鈕的狀態
Step 1: 變量定義

class CXDlg : public CDialog
{
    ......
    public:
        typedef ITaskbarList *LPITaskbarList;
        LPITaskbarList pTaskbar;
    ......
};

Step 2: 初始化 任務欄COM 對象

BOOL CXDlg::OnInitDialog()
{
    ......
    // Initializes the Component Object Model(COM)
    CoInitialize(0);
    // We call below function since we only need to create one object
    CoCreateInstance(
        CLSID_TaskbarList,
        0,
        CLSCTX_INPROC_SERVER,
        IID_ITaskbarList,
        (void**)&pTaskbar
    );
    // Below function will initialize the taskbar list object
    pTaskbar->HrInit();
    ......
}

Step 3: 使用:刪除/顯示 任務欄程序按鈕

void CXDlg::OnBnClickedButtonHide()
{
    pTaskbar->DeleteTab(this->GetSafeHwnd());
}

void CXDlg::OnBnClickedButtonShow()
{
    pTaskbar->AddTab(this->GetSafeHwnd());
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章