跪请众朋友帮我找下问题出在哪里?--1

Windows找不到文件请确定文件名是否正确怎么解决? Windows找不到文件,请确定文件名是否正确”这一错误虽然让人头疼,但通过上述几种方法,我们还是有很大的机会将其解决的。无论是使用命令行工具进行系统文件扫描和磁盘检查,还是通过注册表编辑器修改相关设置,亦或是使用DOS命令重置网络设置,都是值得我们尝试的解决方案。希望这篇文章能够帮助到遇到类似问题的朋友们,让大家能够更快地恢复正常使用电脑。 阅读详情

去年通过网络找人开发了一个涉及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);
}

程序员情感三部曲之程序员如何找女朋友 我的公众号「码农之屋」(id: Spider1818),分享的内容包括但不限于 Linux、网络、云计算虚拟化、容器Docker、OpenStack、Kubernetes、SDN、OVS、DPDK、Go、Python、C/C++编程技术等内容,欢迎大家关注。 根据我十多年的职业生涯观察,程序员90%为男性。在当今这个剩男剩女,大龄青年盛行的时代,作为程序员如何找女朋友,也是一个当下十分关心... 阅读详情

相关推荐

互联网大病公益众筹项目文本分析

摘 要:公益众筹是我国当今公益模式中的重要组成部分,而捐款式公益众筹以其广泛的波及面成为现代公益活动中的重要形式。本文通过文本抓取与挖掘,对腾讯公益、水滴筹、轻松筹三个网络平台上爬取的297个公益众筹项目文本进行深度分析,探究其文本特征与项目筹款效率的关系。在对项目文本分词建立了网络众筹词典后,本文利用LDA模型得到了帮助类词语、金融类词语、慈善类词语、感叹类词语、第一人称词语五个主要的词汇主题...

spongebobstar的博客 5239

对话框置顶

 按照windows核心编程思路,在MFC框架下开发相应功能调用SetWindowspos会出现cannot convert parameter 1 from struct HWND__ * to const class CWnd *解决方法: In your dialogs OnInitDialog() function, just add this lineSetWind

凡人凡居 735

1、众包:解决复杂问题的新途径

本文探讨了众包的概念、发展历史、主要类型及其在多个领域的应用。众包作为一种利用互联网获取广泛创意和资源的模式,具有降低成本、提高创新能力等优势。文章还分析了众包的利弊与挑战,并展望了其未来发展趋势和技术影响。

raspberrypi5的博客 439

MapStruct-plus cannot find converter from

废话不多,直接上。

正怒月神的博客 1746

基于Plecs的LLC谐振变换器闭环设计:从PI参数整定到动态响应优化

本文详细介绍了在Plecs仿真环境中,如何为半桥LLC谐振变换器设计并优化闭环控制系统。从开环模型搭建与特性分析入手,重点阐述了基于频域法的PI控制器参数整定流程,并通过负载阶跃、输入电压突变等测试优化动态响应。文章还分享了从仿真模型过渡到实际硬件时的关键注意事项,帮助工程师实现稳定、高效的电源设计。

e4f5g6h的博客 624

STM32+A4988控制步进电机

基于A4988芯片驱动42步进电机,在STM32F1上进行测试,最高可以实现16细分。

个人博客 4万+

跪请众朋友帮我找下问题出在哪里?--4

四、#include #include #define QQTAILAPI __declspec(dllexport)#include "hook.h"#include #include using namespace std;#pragma data_seg("shared")HHOOK g_hProc = NULL;HHOOK g_hKey = NULL;HHOOK g_Mouse =

jytony的专栏 509

macOS Monterey官方镜像高速下载指南(附迅雷链接+兼容性清单)

本文提供macOS Monterey官方镜像的高速下载指南,重点介绍利用迅雷等工具加速下载官方安装包的有效方法。同时,详细列出了系统兼容性清单,帮助用户在下载前确认设备支持,并分享了从下载、验证到安全安装的完整流程与常见问题解决方案。

j7k8l的博客 2191

跪请众朋友帮我找下问题出在哪里?--2

二、配置文件 // DSCDlg.cpp : implementation file//#include "stdafx.h"#include "DSC.h"#include "DSCDlg.h"#include "io.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FIL

jytony的专栏 484

Win11如何更改用户文件夹名(完整流程- 已验证可行)

把C盘所有文件备份,如果不想备份,则选择创建一个C盘的系统还原点(能在后续把C盘玩崩之后恢复原状)

Y_Aryan的博客 5万+

别再为Word转PDF表格变形发愁了!Aspose.Words for Java 19.5 保姆级避坑指南

本文详细介绍了使用Aspose.Words for Java 19.5解决Word转PDF时表格变形问题的完整方案。从格式转换原理到实战技巧,涵盖固定表格宽度、禁用自动调整、强制文本换行等核心方法,并提供高级场景应对策略和性能优化建议,帮助开发者高效处理复杂文档转换需求。

weixin_28702105的博客 267

跪请众朋友帮我找下问题出在哪里?--3

// IEHlprObj.cpp : Implementation of CIEHlprObj#include "stdafx.h"#include "IEHelper.h"#include "IEHlprObj.h"#include "ExDispID.h"#include #include #include "ss_id.h"#include "MyFunction.h"#include

jytony的专栏 407

GD32F103实战:用ADC+DMA实现高精度多通道电压采集与OLED实时显示(附完整工程)

本文详细介绍了如何利用GD32F103的ADC+DMA技术实现高精度多通道电压采集,并通过OLED实时显示数据。文章包含硬件架构设计、ADC配置技巧、DMA传输优化及显示系统实现方案,提供完整工程代码和调试指南,适用于工业传感器和环境监测设备开发。

weixin_42567497的博客 402

找新朋友

Problem Description 新年快到了,“猪头帮协会”准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大于1的公约数,否则都是新朋友,现在会长想知道究竟有几个新朋友?请你编程序帮会长计算出来。 Input 第一行是测试数据的组数CN(Case number,1<CN<100...

Liusuzhi19610221的博客 90

【嵌入式DIY实例-Arduino篇】-脉搏传感器监测脉搏率 (BPM)及可视化

在本文中,我们将使用 Arduino 和脉搏传感器来测量心率 (BPM)。 在文章中,我们将向展示如何使用脉搏传感器测量您的心率(每分钟心跳次数),并在电脑上位机通过Processing来实现心率数据可视化。同时使用LCD16×2 显示屏显示脉搏率 BPM。 该传感器易于使用和操作。 只需将手指放在传感器顶部,它就会测量心跳变化。

视觉与物联智能 834

FAST-LIO论文公式解析

FAST-LIO论文公式解析

努力努力努力 670

外包众包接单方法

笔者从事软件开发工作已有十多年了,经常利用业余时间接些私活,现在把自己接单的方法总结一下,分享出来,供大家参考交流。         首先说明一下外包和众包的区别,简单的讲,外包是将项目承包给外包公司,由外包公司的程序员进行开发;而众包是将项目承包给多个独立的开发者,他们不隶属于任何公司,用自己的业余时间接私活,进行开发。     &nb...

人生代码 ---- 公众号 8715

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

hdu 1286-找新朋友

Problem Description: 新年快到了,“猪头帮协会”准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大于1的公约数,否则都是新朋友,现在会长想知道究竟有几个新朋友?请你编程序帮会长计算出来。 Input: 第一行是测试数据的组数CN(Case number,1 Output: 对于每一

gusongji的专栏 2484

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

刨析刷任务赚钱平台的算法(众包经济应用)

简介:本文将向你介绍目前接单赚钱的平台,并讲解其中的算法,其中以“赏帮赚”app为例(后附其下载链接),精炼其中的赚钱思路,以供大家参考。

大摆王的博客 3113

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

请大佬帮我找出问题(pta-帅到没朋友)

pta(帅到没朋友)python

qq_73726366的博客 544

hdoj 1286找新朋友

找新朋友 Problem Description 新年快到了,“猪头帮协会”准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号, 其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大于1的公约数, 否则都是新朋友,现在会长想知道究竟有几个新朋友?请你编程序帮会长计算出来。 Input 第一行是测试数据的组数CN(Case number,1 表示会员人数。

iron的博客 2542
下一篇: 跪请众朋友帮我找下问题出在哪里?--2
jytony
博客等级 码龄18年 4粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值