📄 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 + -