去年通过网络找人开发了一个涉及BHO及钩子的程序,主要用来对WINDOWS中(程序)窗口的打开、关闭、最大最小化、窗口间切换操作等时发出的消息进行控制。通过判断这些消息来进一步控制通过COM口控制的一个外部设备。因为已有联系方式都断了,现在程序运行时出现问题只有通过网络来请朋友提示解决了!
问题一:当打开3~4个同一IE地址,如WWW.BAIDU.COM, 在互相切换的过程中有时会出错。
问题二:程序运行时间长后好象越来越慢, 请问是否为程序中的CDWordArray m_ieArr 的原因,怎么限制范围?
下面我会把全部程序附出来,请指点:)
一、TestHookDlg.cpp :
// TestHookDlg.cpp : implementation file
//
#include "stdafx.h"
#include "TestHook.h"
#include "TestHookDlg.h"
#include "hook.h"
#include "comaccess.h"
#include "hook_mouse.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CStringArray m_exeArr;
CStringArray m_specArr;
CStringArray m_urlArr;
bool bInit = false;
//CSerialPortQg g_ser;
CString CMS_STATUS = "STATUS";
#define BSC_FILE "DSC_CONFIG.INF"
#define MAX 2
bool g_bInProcess = false;
/
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/
// CTestHookDlg dialog
void SpiltString(CString spiltString, CString strSeps, CStringArray *outArr)
{
char *p = new char [strlen(spiltString)+1];
strcpy(p, spiltString);
char seps[32];
strcpy(seps, strSeps);
char *token;
token = strtok( p, seps );
while( token != NULL )
{
CString str(token);
outArr->Add(str);
token = strtok( NULL, seps );
}
delete p;
p = NULL;
}
CString LoadSettingStr(CString strKey, CString defaultData, CString strFile)
{
char buff[1024];
ZeroMemory(buff, sizeof(buff));
GetPrivateProfileString("HEADER", strKey, defaultData, buff, 1024 , strFile);
return buff;
}
CTestHookDlg::CTestHookDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestHookDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTestHookDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_bActive = false;
m_oldProc = "";
m_bLastClose = false;
m_strTopWindow = "bho - 写字板";
m_topmostWnd = NULL;
m_curSpecExe = "";
bLastOpenIE = false;
m_shortTimes = 0;
m_bfon = false;
m_activeTimes = 0;
m_activateTimes = 0;
m_bRunSpecExe = false;
m_firstRun = false;
m_lastCloseIEID = -1;
}
CTestHookDlg::~CTestHookDlg()
{
}
void CTestHookDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTestHookDlg)
DDX_Control(pDX, IDC_LIST1, m_list);
DDX_Control(pDX, IDC_MSCOMM, m_comCtrl);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTestHookDlg, CDialog)
//{{AFX_MSG_MAP(CTestHookDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_END, OnButtonEnd)
ON_BN_CLICKED(IDC_BUTTON_CLEAR, OnButtonClear)
ON_WM_CLOSE()
ON_WM_TIMER()
ON_MESSAGE(WM_USER+100, OnOpenProcess)
ON_MESSAGE(WM_USER+101, OnActiveProcess)
ON_MESSAGE(WM_USER+102, OnUnactiveProcess)
ON_MESSAGE(WM_USER+103, OnCloseProcess)
ON_MESSAGE(WM_USER+104, OnOpenDefaultUrl)
ON_MESSAGE(WM_USER+105, OnOpenOtherUrl)
ON_MESSAGE(WM_USER+110, OnStop)
ON_MESSAGE(WM_USER+111, OnBegin)
ON_MESSAGE(WM_USER+113, OnStopSpecExe)
ON_MESSAGE(WM_USER+112, OnBeginSpecExe)
ON_MESSAGE(WM_USER+114, OnProcessShift)
ON_MESSAGE(WM_USER+115, OnResetHook)
ON_MESSAGE(WM_USER+116, OnCloseIE)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/*
ON_MESSAGE(WM_USER+100, OnOpenProcess)
ON_MESSAGE(WM_USER+101, OnActiveProcess)
ON_MESSAGE(WM_USER+102, OnUnactiveProcess)
ON_MESSAGE(WM_USER+103, OnCloseProcess)
ON_MESSAGE(WM_USER+104, OnOpenDefaultUrl)
ON_MESSAGE(WM_USER+105, OnOpenOtherUrl)
ON_MESSAGE(WM_COMM_RXCHAR, SerialRX)
*/
/
// CTestHookDlg message handlers
CString CTestHookDlg::GetCurrentWeb(long procID)
{
//HWND hIE=::FindWindow("IEFRAME",0); //获得第一个IE窗口
HWND hIE=::GetForegroundWindow();
HWND hbegin=hIE; //记录下来
bool bnext=false;
while(hIE)
{
TCHAR bb[200];
//获取标题
::SendMessage(hIE,WM_GETTEXT,200,(LPARAM)bb);
CString ss(bb);
//注意:explorer也是使用的IE窗口,也含有地址栏,判断是不是正在浏览网页的真正IE窗口
if(ss.Find("Microsoft Internet Explorer")>0)
//一般情况下这样判断是可以的,除非你的IE被别人恶意修改了,呵呵
{
//unsigned long id;
//GetWindowThreadProcessId(hIE, &id);
//if(id==(unsigned long)procID)
{
bool bfind=false;
HWND hSub=::FindWindowEx(hIE,0,_T("WorkerW"),0);//查找子窗口
while(hSub && !bfind)
{
HWND hss=::FindWindowEx(hSub,0,_T("ReBarWindow32"),0);
while(hss && !bfind)
{
//找到包含地址栏的窗口,取地址
HWND hs3=::FindWindowEx(hss,0,"ComboBoxEx32",0);
if(hs3)
{
bfind=true;
::SendMessage(hs3,WM_GETTEXT,200,(LPARAM)bb);
return bb;
}
}
hSub=::FindWindowEx(hIE,hSub,_T("RebarWindow32"),0);
}
}
}
hIE=::GetNextWindow(hIE,GW_HWNDNEXT);//按照z-序向下找
//如果已经到最下边了,从hbegin开始向上找
if(!hIE && !bnext)
{
bnext=true;
hIE=::GetNextWindow(hbegin,GW_HWNDPREV);
}
}
return "";
}
void WriteLog(CString str)
{
FILE *pf=fopen("C://bho.doc","a");
if(pf)
{
fwrite(str, sizeof(char), strlen(str), pf);
fprintf(pf, "/n");
fclose(pf);
}
}
bool CTestHookDlg::MinsizeAllWindow()
{
WriteLog("回桌面");
HWND hTaskBar = ::FindWindow("Shell_TrayWnd", NULL);
::SendMessage(hTaskBar, WM_HOTKEY, 0x1fe, 0);
ReturnDesktop(true);
while(1)
{
HWND wnd = ::GetActiveWindow();
wnd = ::WindowFromDC(::GetDC(wnd));
char buff[256] = {0};
::GetClassName(wnd,buff,256);
if(strcmp(buff, "#32769")==0)
{
//SetTimer(0, 2000, 0);
break;
}
Sleep(10);
}
SetTimer(0, 2000, 0);
return true;
}
CString CTestHookDlg::ProcessCMD(CString cmd)
{
UpdateData(true); //读取编辑框内容
CByteArray sendArr; //创建存放字符串数据CByteArray类的实例
WORD wLength;
wLength = cmd.GetLength();
sendArr.SetSize(wLength);
for(int i =0; i<wLength; i++)
{
sendArr.SetAt(i, cmd.GetAt(i));
}
if(m_comCtrl.GetPortOpen())
{
m_comCtrl.SetOutput(COleVariant(sendArr)); //发送数据
}
CString str;
for(i=0; i<20; i++)
{
Sleep(50);
if(m_comCtrl.GetPortOpen())
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
variant_inp=m_comCtrl.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
// 接受数据
for(k=0; k<len; k++)
{
safearray_inp.GetElement(&k,rxdata+k); //转换为BYTE型数组
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
str+=strtemp;
}
}
if(str!="")
break;
}
return str;
}
BOOL CTestHookDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
//GetCurrentWeb();
//MinsizeAllWindow();
CopyFile("C://bho.doc", "C://bho_backup.doc", false);
DeleteFile("C://bho.doc");
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
char syspath[256]={0};
GetWindowsDirectory(syspath,MAX_PATH);
strcat(syspath, "//");
strcat(syspath, BSC_FILE);
CString str = LoadSettingStr("exe", "", syspath);
SpiltString(str, ",", &m_exeArr);
str = LoadSettingStr("spec_exe", "", syspath);
SpiltString(str, ",", &m_specArr);
str = LoadSettingStr("url", "", syspath);
SpiltString(str, ",", &m_urlArr);
str = LoadSettingStr("dev_com", "1", syspath);
CString strPort = "com"+str;
m_comCtrl.SetCommPort(atoi(str)); //选择COM1
m_comCtrl.SetInBufferSize(1024); //接收缓冲区
m_comCtrl.SetOutBufferSize(1024);//发送缓冲区
m_comCtrl.SetInputLen(0);//设置当前接收区数据长度为0,表示全部读取
m_comCtrl.SetInputMode(1);//以二进制方式读写数据
m_comCtrl.SetRThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件
m_comCtrl.SetSettings("9600,n,8,1");//波特率9600无检验位,8个数据位,1个停止位
if(!m_comCtrl.GetPortOpen())//如果串口没有打开则打开
m_comCtrl.SetPortOpen(TRUE);//打开串口
else
m_comCtrl.SetOutBufferCount(0);
bool bComOK = true;
Sleep(500);
for(int i=0; i<MAX; i++)
{
CString str = ProcessCMD("POFF");
if(str!="")
break;
else if(i==MAX-1)
{
bComOK = false;
//EndProcess();
}
}
for(i=0; i<MAX; i++)
{
CString str = ProcessCMD("PON");
if(str!="")
break;
else if(i==MAX-1)
{
bComOK = false;
EndProcess();
}
}
MinsizeAllWindow();
//SetHook(m_hWnd);
SetTimer(3, 1000*5, 0);
return TRUE; // return TRUE unless you set the focus to a control
}
void CTestHookDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CTestHookDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CTestHookDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CTestHookDlg::OnOK()
{
// TODO: Add extra validation here
SetHook(m_hWnd);
}
void CTestHookDlg::OnButtonEnd()
{
// TODO: Add your control notification handler code here
RemoveHook();
}
bool CTestHookDlg::ProcessSingleFOFF()
{
/*CString str = ProcessCMD("STATUS");
if(str!="FONOK")
{
return true;
}*/
if(!m_bfon)
return true;
for(int i=0; i<MAX; i++)
{
CString str;
str = ProcessCMD("FOFF");
if(str!="")
{
m_bfon = false;
break;
}
else if(i==MAX-1)
{
EndProcess();
return false;
}
}
return true;
}
bool CTestHookDlg::ProcessFON()
{
if(m_bfon)
return true;
int i=0;
for(i=0; i<MAX; i++)
{
CString str = ProcessCMD("FON");
if(str!="")
{
m_bfon = true;
break;
}
else if(i==MAX-1)
{
EndProcess();
return false;
}
}
/*CString str = ProcessCMD("STATUS");
if(str=="FONOK")
{
return true;
}
else if(str=="PONOK" || str=="FOFFOK")
{
for(i=0; i<MAX; i++)
{
str = ProcessCMD("FON");
if(str=="FONOK")
return true;
else if(i==MAX-1)
{
EndProcess();
return false;
}
}
}
else if(str=="POFFOK")
{
for(i=0; i<MAX; i++)
{
str = ProcessCMD("PON");
if(str=="PONOK")
break;
else if(i==MAX-1)
{
EndProcess();
return false;
}
}
for(i=0; i<MAX; i++)
{
str = ProcessCMD("FON");
if(str=="FONOK")
return true;
else if(i==MAX-1)
{
EndProcess();
return false;
}
}
}*/
return false;
}
bool CTestHookDlg::ProcessFOFF()
{
int i=0;
CString str = ProcessCMD("STATUS");
if(str=="FOFFOK")
{
/*for(i=0; i<MAX; i++)
{
str = ProcessCMD("FON");
if(str=="FONOK")
return true;
else if(i==MAX-1)
{
AfxMessageBox("请检查控制线连接!");
return false;
}
}
for(i=0; i<MAX; i++)
{
str = ProcessCMD("FOFF");
if(str=="FOFFOK")
return true;
else if(i==MAX-1)
{
AfxMessageBox("请检查控制线连接!");
return false;
}
}*/
return true;
}
else if(str=="POFFOK")
{
for(i=0; i<MAX; i++)
{
str = ProcessCMD("PON");
if(str=="PONOK")
return true;
else if(i==MAX-1)
{
EndProcess();
return false;
}
}
/*for(i=0; i<MAX; i++)
{
str = ProcessCMD("FON");
if(str=="FONOK")
return true;
else if(i==MAX-1)
{
AfxMessageBox("请检查控制线连接!");
return false;
}
}*/
for(i=0; i<MAX; i++)
{
str = ProcessCMD("FOFF");
if(str=="FOFFOK")
return true;
else if(i==MAX-1)
{
EndProcess();
return false;
}
}
}
else if(str=="FONOK")
{
for(i=0; i<MAX; i++)
{
str = ProcessCMD("FOFF");
if(str=="FOFFOK")
return true;
else if(i==MAX-1)
{
EndProcess();
return false;
}
}
}
return false;
}
bool bLastClose = false;
void CTestHookDlg::OnStop(WPARAM wparam,LPARAM lparam)
{
if(m_bRunSpecExe)
return;
if(lparam>1)
{
HWND hWindow=::GetForegroundWindow();
unsigned long id;
GetWindowThreadProcessId(hWindow, &id);
if(id!=(unsigned long)lparam)
{
return;
}
}
ProcessSingleFOFF();
/*bool bUse = false;
if(lparam>1)
{
for(int i=0; i<m_ieArr.GetSize(); i++)
{
if(m_ieArr.GetAt(i)==lparam)
{
m_ieArr.RemoveAt(i);
bUse = true;
break;
}
}
}*/
/*if(bLastClose)
{
bLastClose = false;
WriteLog("回到桌面");
MinsizeAllWindow();
return;
}*/
/*int val = (int)wparam;
if(val==2 || (val==1 && bUse))
{
bLastClose = true;
WriteLog("最后一次动作是关闭程序");
}*/
WriteLog("结束拷屏");
}
void CTestHookDlg::OnProcessShift(WPARAM wparam,LPARAM lparam)
{
if(m_bRunSpecExe)
return;
//切换到不需拷贝的程序,如上次是关闭则回到桌面
ProcessSingleFOFF();
WriteLog("结束拷屏");
if(bLastClose)
{
bLastClose = false;
WriteLog("回到桌面");
//MinsizeAllWindow();
}
}
void CTestHookDlg::OnResetHook(WPARAM wparam,LPARAM lparam)
{
SetTimer(4, 100, 0);
}
void CTestHookDlg::OnBegin(WPARAM wparam,LPARAM lparam)
{
if(m_bRunSpecExe)
return;
int i;
if(lparam>1)
{
if(m_lastCloseIEID == lparam)
{
m_ieArr.Add(m_lastCloseIEID);
m_lastCloseIEID = -1;
}
bool bDefault = false;
for(i=0; i<m_ieArr.GetSize(); i++)
{
if(lparam == m_ieArr.GetAt(i))
{
bLastClose = false;
ProcessFON();
bDefault = true;
WriteLog("开始拷屏");
break;
}
}
if(!bDefault)
{
if(bLastClose)
{
bLastClose = false;
ProcessSingleFOFF();
//MinsizeAllWindow();
return;
}
else
{
ProcessSingleFOFF();
}
WriteLog("结束拷屏");
}
}
else
{
bLastClose = false;
ProcessFON();
WriteLog("开始拷屏");
}
m_lastCloseIEID = -1;
}
void CTestHookDlg::OnStopSpecExe(WPARAM wparam,LPARAM lparam)
{
//MinsizeAllWindow();
m_bRunSpecExe = false;
}
void CTestHookDlg::OnBeginSpecExe(WPARAM wparam,LPARAM lparam)
{
m_bRunSpecExe = true;
ReturnDesktop(true);
ProcessFON();
SetTimer(1, 2000, 0);
}
void CTestHookDlg::OnOpenProcess(WPARAM wparam,LPARAM lparam)
{
::OpenClipboard(NULL);
HANDLE hClip;
char *pBuf;
hClip=GetClipboardData(CF_TEXT);
pBuf=(char*)GlobalLock(hClip);
GlobalUnlock(hClip);
CString str;
int i;
//其它程序=0; 特殊程序=1; 设置程序=2
int procType=0;
for(i=0; i<m_specArr.GetSize(); i++)
{
if(strstr(pBuf, m_specArr.GetAt(i)))
{
procType = 1;
break;
}
}
if(procType==1 && m_curSpecExe=="")
{
m_curSpecExe = pBuf;
for(i=0; i<MAX; i++)
{
str = ProcessCMD("FON");
if(str=="FONOK")
break;
else if(i==MAX-1)
{
EndProcess();
}
}
SetTimer(1, 2000, 0);
}
else
{
//ProcessSingleFOFF();
//::PostMessage(m_hWnd, WM_USER+101, 0, 0);
//OnActiveProcess(0,0);
}
if(strstr(pBuf, "iexplore.exe"))
{
bLastOpenIE = true;
}
m_curProc = "";
/*if(procType==0)
{
//先判断上次激活的是否有用
bool bOldAvailble = false;
for(i=0; i<m_exeArr.GetSize(); i++)
{
if(strstr(m_oldProc, m_exeArr.GetAt(i)))
{
bOldAvailble = true;
break;
}
}
if(!bOldAvailble)
{
for(i=0; i<m_urlArr.GetSize(); i++)
{
if(strstr(m_oldProc, m_urlArr.GetAt(i)))
{
bOldAvailble = true;
break;
}
}
}
}*/
m_bLastClose = false;
CloseClipboard();
}
void CTestHookDlg::OnActiveProcess(WPARAM wparam,LPARAM lparam)
{
g_bInProcess = false;
if(m_curSpecExe!="")
return;
int i;
//先判断上次激活的是否有用
bool bOldAvailble = false;
for(i=0; i<m_exeArr.GetSize(); i++)
{
if(strstr(m_oldProc, m_exeArr.GetAt(i)))
{
bOldAvailble = true;
break;
}
}
if(!bOldAvailble)
{
for(i=0; i<m_urlArr.GetSize(); i++)
{
if(strstr(m_oldProc, m_urlArr.GetAt(i)))
{
bOldAvailble = true;
break;
}
}
}
::OpenClipboard(NULL);
HANDLE hClip;
char *pBuf;
hClip=GetClipboardData(CF_TEXT);
pBuf=(char*)GlobalLock(hClip);
GlobalUnlock(hClip);
WriteLog(pBuf);
//保存当前激活的程序
m_curProc = pBuf;
//其它程序=0; 特殊程序=1; 设置程序=2; IE=3
WriteLog(pBuf);
int procType=0;
if(strstr(pBuf, "iexplore.exe"))
{
procType = 3;
}
if(procType==0)
{
for(i=0; i<m_specArr.GetSize(); i++)
{
if(strstr(pBuf, m_specArr.GetAt(i)))
{
procType = 1;
break;
}
}
}
if(procType==0)
{
for(i=0; i<m_exeArr.GetSize(); i++)
{
if(strstr(pBuf, m_exeArr.GetAt(i)))
{
procType = 2;
break;
}
}
}
if(procType==0)
{
WriteLog("应用程序结束拷屏");
ProcessSingleFOFF();
if(m_bLastClose)
{
if(bOldAvailble)
{
//MinsizeAllWindow();
}
/*CString str = ProcessCMD("STATUS");
if(str=="FONOK")
{
MinsizeAllWindow();
ProcessFOFF();
} */
//MinsizeAllWindow();
}
else
{
//ProcessSingleFOFF();
}
m_oldProc = pBuf;
Sleep(200);
//TopmostCurWindow();
}
else if(procType==2)
{
//if(!bOldAvailble)
{
ProcessFON();
WriteLog("应用程序开始拷屏");
}
m_oldProc = pBuf;
}
else if(procType==3)
{
CString url = GetCurrentWeb();
url.MakeLower();
bool bFind = false;
for(i=0; i<m_urlArr.GetSize(); i++)
{
if(strstr(url, m_urlArr.GetAt(i)))
{
bFind = true;
break;
}
}
if(bFind)
{
if(!bLastOpenIE)
{
ProcessFON();
WriteLog("IE开始拷屏");
}
}
else
{
ProcessSingleFOFF();
if(m_bLastClose)
{
//MinsizeAllWindow();
if(bOldAvailble)
{
//MinsizeAllWindow();
}
}
else
{
//ProcessSingleFOFF();
WriteLog("IE结束拷屏");
}
}
m_oldProc = url;
}
CloseClipboard();
m_bLastClose = false;
bLastOpenIE = false;
}
void CTestHookDlg::OnUnactiveProcess(WPARAM wparam,LPARAM lparam)
{
m_activeTimes++;
g_bInProcess = true;
if(m_curSpecExe!="")
return;
WriteLog("程序发生切换结束拷屏");
ProcessSingleFOFF();
/*::OpenClipboard(NULL);
HANDLE hClip;
char *pBuf;
hClip=GetClipboardData(CF_TEXT);
pBuf=(char*)GlobalLock(hClip);
int i;
//其它程序=0; 特殊程序=1; 设置程序=2
if(strcmp(m_curProc, pBuf)==0)
{
ProcessSingleFOFF();
m_curSpecExe = "";
}
GlobalUnlock(hClip);
CloseClipboard();*/
}
void CTestHookDlg::OnCloseProcess(WPARAM wparam,LPARAM lparam)
{
//m_oldProc = "";
m_curProc = "";
::OpenClipboard(NULL);
HANDLE hClip;
char *pBuf;
hClip=GetClipboardData(CF_TEXT);
pBuf=(char*)GlobalLock(hClip);
int i;
//其它程序=0; 特殊程序=1; 设置程序=2
if(strcmp(m_curSpecExe, pBuf)==0)
{
MinsizeAllWindow();
m_curSpecExe = "";
}
else
{
ProcessSingleFOFF();
}
GlobalUnlock(hClip);
CloseClipboard();
Sleep(200);
m_bLastClose = true;
/*CString str;
str.Format("关闭程序:%s", pBuf);
WriteLog(str);
int i;
//其它程序=0; 特殊程序=1; 设置程序=2
int procType=0;
for(i=0; i<m_specArr.GetSize(); i++)
{
if(strstr(str, m_specArr.GetAt(i)))
{
procType = 1;
break;
}
}
if(procType==0)
{
for(i=0; i<m_exeArr.GetSize(); i++)
{
if(strstr(str, m_exeArr.GetAt(i)))
{
procType = 2;
break;
}
}
}
if(procType==0)
ProcessFOFF();
else if(procType==2)
ProcessFON();
else if(procType==1)
{
MinsizeAllWindow();
ProcessFON();
}
//ProcessFOFF();
GlobalUnlock(hClip);
CloseClipboard();*/
}
void CTestHookDlg::OnButtonClear()
{
m_list.ResetContent();
}
LRESULT CTestHookDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if(message==WM_QUERYENDSESSION)
{
for(int i=0; i<MAX; i++)
{
CString str = ProcessCMD("POFF");
if(str=="POFFOK")
break;
else if(i==MAX-1)
{
EndProcess();
}
}
}
//隐藏对话框
if(message==133)
ShowWindow(SW_HIDE);
return CDialog::DefWindowProc(message, wParam, lParam);
}
void CTestHookDlg::OnOpenDefaultUrl(WPARAM wparam,LPARAM lparam)
{
if(m_bRunSpecExe)
return;
HWND hWindow=::GetForegroundWindow();
unsigned long id;
GetWindowThreadProcessId(hWindow, &id);
if(id!=(unsigned long)lparam)
{
return;
}
int i;
//先判断上次激活的是否有用
bool bOldAvailble = false;
for(i=0; i<m_exeArr.GetSize(); i++)
{
if(strstr(m_oldProc, m_exeArr.GetAt(i)))
{
bOldAvailble = true;
break;
}
}
if(!bOldAvailble)
{
for(i=0; i<m_urlArr.GetSize(); i++)
{
if(strstr(m_oldProc, m_urlArr.GetAt(i)))
{
bOldAvailble = true;
break;
}
}
}
::OpenClipboard(NULL);
HANDLE hClip;
char *pBuf;
hClip=GetClipboardData(CF_TEXT);
pBuf=(char*)GlobalLock(hClip);
GlobalUnlock(hClip);
CString str;
str.Format("打开预设的URL:%s", pBuf);
//str = "打开预设的URL:";
m_oldProc = pBuf;
CloseClipboard();
//if(!bOldAvailble)
ProcessFON();
WriteLog("IEHELPER开始拷屏");
bool bFind=false;
str.Format("传来的ID:%d", lparam);
WriteLog(str);
for(i=0; i<m_ieArr.GetSize(); i++)
{
if(m_ieArr.GetAt(i)==lparam)
{
bFind = true;
break;
}
}
if(!bFind)
m_ieArr.Add(lparam);
}
void CTestHookDlg::OnOpenOtherUrl(WPARAM wparam,LPARAM lparam)
{
if(m_bRunSpecExe)
return;
ProcessSingleFOFF();
HWND hWindow=::GetForegroundWindow();
unsigned long id;
GetWindowThreadProcessId(hWindow, &id);
CString str;
str.Format("传来的ID - WINDOW ID:%d - %d", lparam, id);
WriteLog(str);
if(wparam==3 || id==(unsigned long)lparam)
{
int i;
for(i=0; i<m_ieArr.GetSize(); i++)
{
if(m_ieArr.GetAt(i)==lparam)
{
m_ieArr.RemoveAt(i);
break;
}
}
//ProcessSingleFOFF();
WriteLog("IEHELPER结束拷屏");
}
}
void CTestHookDlg::OnCloseIE(WPARAM wparam,LPARAM lparam)
{
if(m_bRunSpecExe)
return;
ProcessSingleFOFF();
int i;
for(i=0; i<m_ieArr.GetSize(); i++)
{
if(m_ieArr.GetAt(i)==lparam)
{
m_lastCloseIEID = lparam;
m_ieArr.RemoveAt(i);
break;
}
}
WriteLog("IEHELPER结束拷屏");
}
BOOL CTestHookDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
return CDialog::PreTranslateMessage(pMsg);
//
}
void CTestHookDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
if(m_comCtrl.GetPortOpen())//如果串口没有打开则打开
m_comCtrl.SetPortOpen(FALSE);//打开串口
RemoveHook();
CDialog::OnOK();
}
BEGIN_EVENTSINK_MAP(CTestHookDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CTestHookDlg)
//ON_EVENT(CTestHookDlg, IDC_MSCOMM, 1 /* OnComm */, OnOnCommMscomm, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
CString recd;
/*
void CTestHookDlg::OnOnCommMscomm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
switch(m_comCtrl.GetCommEvent())
{
case 1: // comEvSend发送数据
break;
case 2: // comEvReceive读取数据
// MessageBox(_T("读取数据事件"), _T("TRACE"), MB_OK);
variant_inp=m_comCtrl.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
// 接受数据
for(k=0; k<len; k++)
{
safearray_inp.GetElement(&k,rxdata+k); //转换为BYTE型数组
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
recd+=strtemp;
}
// UpdateData(TRUE);
break;
default:
m_comCtrl.SetOutBufferCount(0);
break;
}
}*/
void CTestHookDlg::TopmostCurWindow()
{
//m_topmostWnd = ::GetForegroundWindow();
//::SetWindowPos(m_topmostWnd,wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
//HWND m_topmostWnd = ::FindWindow(m_strTopWindow, 0);
//HWND m_topmostWnd = ::GetForegroundWindow();
//char buff[152]={0};
//::GetWindowText(m_topmostWnd, buff, 512);
//m_strTopWindow = buff;
//if(m_topmostWnd)
// ::SetWindowPos(m_topmostWnd,wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}
void CTestHookDlg::TopCurWindow()
{
//m_topmostWnd = ::GetForegroundWindow();
//if(m_topmostWnd)
// ::SetWindowPos(m_topmostWnd,wndBottom, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
/*if(m_strTopWindow!="")
{
HWND wnd = ::FindWindow(m_strTopWindow, 0);
if(wnd!=NULL)
::SetWindowPos(wnd,wndBottom, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}*/
}
void CTestHookDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
int i;
if(nIDEvent==0)
{
if(!m_bfon)
{
for(i=0; i<MAX; i++)
{
CString str = ProcessCMD("FON");
if(str!="")
{
m_bfon = true;
break;
}
else if(i==MAX-1)
{
EndProcess();
}
}
}
ReturnDesktop(false);
KillTimer(0);
if(!m_firstRun)
{
m_firstRun = false;
SetHook(m_hWnd);
}
}
else if(nIDEvent==1)
{
ProcessSingleFOFF();
ReturnDesktop(false);
KillTimer(1);
}
else if(nIDEvent==3)
{
}
else if(nIDEvent==4)
{
HWND hwnd = ::GetForegroundWindow();
char title[256] = {0};
::GetWindowText(hwnd, title, 255);
if(strcmp(title, ""))
{
RemoveHook();
Sleep(100);
SetHook(m_hWnd);
KillTimer(4);
WriteLog("应用程序重新安装HHHH");
}
}
CDialog::OnTimer(nIDEvent);
}
void CTestHookDlg::EndProcess()
{
RemoveHook();
AfxMessageBox("请检查控制线和电源连接");
WriteLog("程序退出:请检查控制线连接");
OnClose();
/*m_shortTimes++;
WriteLog("程序退出:请检查控制线连接");
if(m_shortTimes>3)
{
AfxMessageBox("请检查控制线连接!");
OnClose();
}*/
//AfxMessageBox("请检查控制线连接!");
//ProcessCMD("PON");
//Sleep(100);
//ProcessCMD("PON");
//OnClose();
//::PostMessage(WM_CLOSE);
}