?? removedigitalsign.cpp
字號:
// RemoveDigitalSign.cpp: implementation of the CRemoveDigitalSign class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "DigitalSign.h"
#include "RemoveDigitalSign.h"
#include "DialogTempleteEx.h"
#include "atlconv.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
static char szDialogClassName[] = "#32770";
static char szSysdmLibrary[] = "sysdm.cpl";
static char szSigtabLibrary[] = "sigtab.dll";
#define FIND_WINDOW_SLEEP_TIME 500 // 毫秒
#define FIND_WINDOW_RETRY_TIMES 5
const UINT uOKButtonID = 1; // OK 按鈕ID
const UINT uDriverSigningButtonID = 2010; // 系統屬性對話框中驅動簽名按鈕的ID
const UINT uDriverSigningDialogID = 102; // 驅動簽名對話框ID
const UINT uIgoreButtonID = 1000; // 驅動簽名對話框中"忽略"按鈕ID
const UINT uWarningButtonID = 1001; // 驅動簽名對話框中"警告"按鈕ID
const UINT uBlockButtonID = 1002; // 驅動簽名對話框中"阻止"按鈕ID
#define SYSTEM_PROPERTY_TITLE_ID 3
CRemoveDigitalSign::CRemoveDigitalSign()
:m_hSystemPropertyWnd(NULL),
m_hDriverSigningDialogWnd(NULL)
{
}
CRemoveDigitalSign::~CRemoveDigitalSign()
{
}
BOOL CRemoveDigitalSign::Start()
{
if(GetNeedStrings() == FALSE) return FALSE;
CloseAllOtherSystemWindow();
TRACE("所有可能引起沖突的窗口都已經關閉\n");
if(StartHardwareDialog() == FALSE) return FALSE;
::PostMessage(
m_hSystemPropertyWnd,
WM_COMMAND,
uDriverSigningButtonID,
(LPARAM)::GetDlgItem(m_hSystemPropertyWnd,uDriverSigningButtonID));
for(int i = 0;i < FIND_WINDOW_RETRY_TIMES;i ++) // 確認驅動簽名窗口確實已經彈出
{
Sleep(FIND_WINDOW_SLEEP_TIME);
m_hDriverSigningDialogWnd = ::FindWindow(szDialogClassName,m_szDriverSigningDialogTitle);
if(m_hDriverSigningDialogWnd)
break;
}
if(i == FIND_WINDOW_RETRY_TIMES) // 如果沒有找到,則返回
{
return FALSE;
}
CButton * pIgoreButton = (CButton *)CWnd::FromHandle(
GetDlgItem(m_hDriverSigningDialogWnd,uIgoreButtonID));
CButton * pWarningButton = (CButton *)CWnd::FromHandle(
GetDlgItem(m_hDriverSigningDialogWnd,uWarningButtonID));
CButton * pBlockButton = (CButton *)CWnd::FromHandle(
GetDlgItem(m_hDriverSigningDialogWnd,uBlockButtonID));
pWarningButton->SetCheck(0); // 把忽略按鈕選中
pBlockButton->SetCheck(0);
pIgoreButton->SetCheck(1);
::SendMessage(m_hDriverSigningDialogWnd, // 選中后關閉驅動簽名對話框
WM_COMMAND,uOKButtonID,
(LPARAM)GetDlgItem(m_hDriverSigningDialogWnd,uOKButtonID));
::SendMessage(m_hSystemPropertyWnd, // 最后關閉系統屬性對話框
WM_COMMAND,uOKButtonID,
(LPARAM)GetDlgItem(m_hSystemPropertyWnd,uOKButtonID));
return TRUE;
}
BOOL CRemoveDigitalSign::StartHardwareDialog()
{
// 最后的那個2是因為硬件在系統屬性里為第二個屬性頁,從0開始
ShellExecute(
NULL,"open","Rundll32.exe",
"shell32.dll,Control_RunDLL sysdm.cpl,,2",
NULL,SW_SHOW);
for(int i = 0;i < FIND_WINDOW_RETRY_TIMES;i ++) // 確認系統屬性窗口確實已經彈出
{
Sleep(FIND_WINDOW_SLEEP_TIME);
m_hSystemPropertyWnd = ::FindWindow(szDialogClassName,m_szSystemPropertyTitle);
if(m_hSystemPropertyWnd)
break;
}
if(i == FIND_WINDOW_RETRY_TIMES) // 沒有找到窗口
{
return FALSE;
}
return TRUE;
}
BOOL CRemoveDigitalSign::GetNeedStrings()
{
USES_CONVERSION;
// 取得系統屬性對話框的標題,此標題字符串位于資源的String Table中
HINSTANCE hSysdmHandle = ::LoadLibrary(szSysdmLibrary);
if(hSysdmHandle == NULL) return FALSE;
::LoadString( // 此處取得標題
hSysdmHandle,
SYSTEM_PROPERTY_TITLE_ID,
m_szSystemPropertyTitle,MAX_PATH);
::FreeLibrary(hSysdmHandle); // 釋放動態鏈接庫
// 去驅動程序簽名對話框標題,此處標題位于對話框資源中
HINSTANCE hDriverSignLibHandle = ::LoadLibrary(szSigtabLibrary);
if(hDriverSignLibHandle == NULL) return FALSE;
HRSRC hDlgSrc = ::FindResource(hDriverSignLibHandle,
MAKEINTRESOURCE(uDriverSigningDialogID),RT_DIALOG);
if(hDlgSrc == NULL)
{
::FreeLibrary(hDriverSignLibHandle);
return FALSE;
}
HGLOBAL hDlgData = ::LoadResource(hDriverSignLibHandle,hDlgSrc);
ASSERT(hDlgData);
LPDLGTEMPLATEEX pDlgInfo = (LPDLGTEMPLATEEX)::LockResource(hDlgData);
ASSERT(pDlgInfo);
char * lpszTitle = W2A(pDlgInfo->title); // 把寬字符轉為ANSI字符,ANSI字符的內存在堆棧
// 里分配,函數結束自動釋放,所謂無需我們來釋放
if(lpszTitle != NULL)
{
strcpy(m_szDriverSigningDialogTitle,lpszTitle);
}
::FreeLibrary(hDriverSignLibHandle);
return TRUE;
}
void CRemoveDigitalSign::CloseAllOtherSystemWindow()
{
::EnumWindows(EnumSystemPropertyWindowsProc,(LPARAM)m_szSystemPropertyTitle);
}
BOOL CRemoveDigitalSign::EnumSystemPropertyWindowsProc(HWND hWnd, LPARAM lParam)
{
LPCTSTR lpszTitle = (LPCTSTR)lParam;
char szWindowTitle[MAX_PATH];
char szWindowClassName[MAX_PATH];
memset(szWindowTitle,0,MAX_PATH);
memset(szWindowClassName,0,MAX_PATH);
::GetClassName(hWnd,szWindowClassName,MAX_PATH);
::GetWindowText(hWnd,szWindowTitle,MAX_PATH);
if(strcmp(lpszTitle,szWindowTitle) == 0 &&
strcmp(szWindowClassName,szDialogClassName) == 0)
{
::SendMessage(hWnd,WM_CLOSE,0,0);
}
TRACE("當前窗口句柄為:0x%08x,標題為:%s\n",hWnd,szWindowTitle);
return TRUE;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -