跪請衆朋友幫我找下問題出在哪裏?--1

去年通過網絡找人開發了一個涉及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);
}

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