小辉程序在讲解过程中以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的朋友可能会有些难。特别是关闭广告条的第二种实现方法可能有些复杂。