?? 自動啟動/關閉廣告條多種方法).txt
字號:
小
輝程序在講解過程中以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的朋友可能會有些難。特別是關閉廣告條的第二種實現方法可能有些復雜。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -