欢迎光临
我们一直在努力

自动启动/关闭广告条多种方法

建站超值云服务器,限时71元/月

小辉程序在讲解过程中以C为基础,某些地方会兼顾讲解Delphi的用法。但由于小辉用Delphi和VB搞开发是在98年以前的事,现在一些技术细节也疏忘了许多,因此,朋友们若问我关于Delphi/VB方面的技术问题,小辉可能无法给你满意的回答,建议你去相关的主页查询。对于涉及界面开发的一些简单问题,恕小辉不能一一回答

自动启动/关闭广告条有很多种方法。这里分别讲述其中两种。

  1. 启动广告条:

  方法一:使用WinExec()函数
  UINT WinExec(
    LPCSTR lpCmdLine, // 包含要执行的命令行
    UINT uCmdShow // 定义了以怎样的形式启动程序的常数值。);

  参数说明:
  LPCSTR lpCmdLine: 包含要执行的命令行。
  系统将在以下范围查找应用程序:
  1. 应用程序启动位置
  2. 当前目录位置
  3. Windows system目录
  4. Windows 目录
  5. path中设置的路径列表

  UNIT uCmdShow: 定义了以怎样的形式启动程序的常数值。具体说明如下:
  SW_HIDE 隐藏窗口,活动状态给令一个窗口
  SW_MINIMIZE 最小化窗口,活动状态给令一个窗口
  SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态
  SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态
  SW_SHOWMAXIMIZED 最大化窗口,并将其激活
  SW_SHOWMINIMIZED 最小化窗口,并将其激活
  SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口
  SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口
  SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口
  SW_SHOWNORMAL 与SW_RESTORE相同
  例如:启动当前目录下的abc.exe 程序:
  WinExec( "abc.exe",SW_SHOW );

  方法二:  
  WinExec是一个兼容win16的函数。win32应用程序可用CreateProcess函数,也可使用ShellExecute函数。具体说明可查阅有关帮助文档。

  2. 关闭广告条

  方法一: 模拟鼠标点击[关闭]按钮

  要用到以下两个API函数:
  VOID mouse_event(
   DWORD dwFlags,
   DWORD dx,
   DWORD dy,
   DWORD dwData,
   DWORD dwExtraInfo
  );  

  设置mouse状态。参数说明如下:
  dwFlags Long,下述标志的一个组合 :
  MOUSEEVENTF_ABSOLUTE dx和dy指定鼠标坐标系统中的一个绝对位置。在鼠标坐标系统中,屏幕在水平和垂直方向上均匀分割成65535×65535个单元
  MOUSEEVENTF_MOVE 移动鼠标
  MOUSEEVENTF_LEFTDOWN 模拟鼠标左键按下
  MOUSEEVENTF_LEFTUP 模拟鼠标左键抬起
  MOUSEEVENTF_RIGHTDOWN 模拟鼠标右键按下
  MOUSEEVENTF_RIGHTUP 模拟鼠标右键按下
  MOUSEEVENTF_MIDDLEDOWN 模拟鼠标中键按下
  MOUSEEVENTF_MIDDLEUP 模拟鼠标中键按下
  dx 根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定水平方向的绝对位置或相对运动
  dy 根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定垂直方向的绝对位置或相对运动
  dwData amount of wheel movement
  dwExtraInfo,通常未用的一个值。用GetMessageExtraInfo函数可取得这个值。可用的值取决于特定的驱动程序

  BOOL SetCursorPos(
   int X, // horizontal position
   int Y // vertical position
  );
  设置鼠标位置。鼠标指针在屏幕像素坐标系统中的X,Y位置

  例如确定广告条的关闭按钮位于座标点(1015,682),则执行下面两段代码中的任意一段都可以实现关闭:
  代码1:

void CloseSpedia()
{
  SetCursorPos(1015,682);
  mouse_event(MOUSEEVENTF_LEFTDOWN ,0,0,0,GetMessageExtraInfo());
  mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,GetMessageExtraInfo ());
}
  代码2:
void CloseSpedia()
{
  mouse_event(MOUSEEVENTF_MOVE,0,1015,682,GetMessageExtraInfo());
  mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,GetMessageExtraInfo());
  mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,GetMessageExtraInfo ());
}
  方法2:找到广告条的句柄,给其发送WM_CLOSE事件。

  要用到以下几个API函数:
  BOOL EnumWindows(
    WNDENUMPROC lpEnumFunc, // pointer to callback function
    LPARAM lParam // application-defined value
  );
  枚举窗口列表中的所有父窗口(顶级和被所有窗口)

  BOOL PostMessage(
    HWND hWnd, // handle of destination window
    UINT Msg, // message to post
    WPARAM wParam, // first message parameter
    LPARAM lParam // second message parameter
  );
  将一条消息投递到指定窗口的消息队列

  int GetWindowText(
    HWND hWnd, // handle to window or control with text
    LPTSTR lpString, // address of buffer for text
    int nMaxCount // maximum number of characters to copy
  );
  取得一个窗体的标题(caption)文字

  实现原理:
  通过使用EnumWindows枚举窗口列表中的所有父窗口,在其回调函数中记录所有窗口的标题和句柄。判断若是要关闭的应用程序句柄,则使用PostMessage向其发送WM_CLOSE命令。具体代码如下(假设我我们要关闭的程序是画笔程序):

typedef struct
{
  HWND hWnd;
  char cWinBuf[256];
}WINLIST;
WINLIST gWinList[256];
int giCountWin,j;

BOOL CALLBACK EnumWindowsProc( HWND hWnd, LPARAM lParam )
{
  char buffer[256];
  GetWindowText(hWnd, buffer, 256);
  if ( strlen(buffer) )
  {
    if (giCountWin < 256)
    {
      gWinList[ giCountWin].hWnd = hWnd;
      strcpy(gWinList[ giCountWin].cWinBuf,buffer);
      giCountWin ++;
    }
  }
  return TRUE;
}

void CloseSpedia()
{
  giCountWin = 0;
  EnumWindows( (WNDENUMPROC)EnumWindowsProc,0);
  for ( j = 0; j<giCountWin; j++)
  {
    if ( strcmp(gWinList[j].cWinBuf,"画笔") == 0 )
    {
      ::PostMessage( gWinList[j].hWnd,WM_CLOSE,0,0);
      break;
    }
  }
}

  好了,今天就说到这。这一节涉及到的api函数比较多。对初涉API的朋友可能会有些难。特别是关闭广告条的第二种实现方法可能有些复杂。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 自动启动/关闭广告条多种方法
分享到: 更多 (0)