在Delphi中如何控制其它應用程式窗口
在Delphi中如何控制其它應用程式窗口
廣東省農業管理幹部學院陳建兵
在編寫Delphi的應用程式中,常常涉及對其它Windows應用程式的操作。例如,在資料庫的管理系統中,財務人員需要使用計算器,即可呼叫Windows內含的計算器功能,若每次使用,均透過「開始/程式/附件/計算器」來開啟計算器,顯然是非常繁瑣的,當然可以考慮在桌面上建立一「計算器」的快捷方式,且定義一熱鍵,需要使用計算器時,就按下這個熱鍵來開啟「計算器」。但由於“計算器”是一個“非模式”窗口程序,即每運行一次計算器,就會打開一個“計算器”窗口,這樣的結果是桌面上出現了幾十個“計算器”,不僅大量增加了系統記憶體的開銷,也不方便使用者的操作。在Delphi中可較輕地控制,效果非常完美。以下就兩個主要問題提出實作方法。
1.如何控制設計?
新建一表單,在表單中放入兩個按鈕,其Caption分別為「開啟」(即啟動「計算器」)和「關閉」(退出結束),並為它們分別新增Click事件處理。詳見表單Form1及單元檔案Unit1。
其中,最主要的幾條語句有:
fwnd:=FindWindow('SciCalc','計算機');
函數原型為(詳見Delphi的幫助):
HWND FindWindow(
LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);
此處,'SciCalc' 為計算器的類別名,'計算器'為計算器的視窗標題}
setWindowPos(fwnd,HWND_NOTOPMOST,0,0,0,0,SWP_SHOWWINDOW or SWP_NOSIZE or SWP_NOMOVE);
函數原型為:
BOOL SetWindowPos(
HWND hWnd, // handle of window
HWND hWndInsertAfter, // placement-order handle
int X, // horizontal position
int Y, // vertical position
int cx, // width
int cy, // height
UINT uFlags // window-positioning flags
);
ShowWindow(fwnd,SW_RESTORE); //顯示已開啟的「計算器」
函數原型為:
BOOL ShowWindow(
HWND hWnd, // handle of window
int nCmdShow // show state of window
);
Ret:=WinExec('c:windowscalc.exe',SW_SHOWNORMAL); //啟動計算器
函數原型為:
UINT WinExec(
LPCSTR lpCmdLine, // address of command line
UINT uCmdShow // window style for new application
);
執行「計算器」程式並偵測回傳值(從而利用回傳值來判斷可能發生的錯誤)
2.如何明確應用程式的「類別名稱」?
要控制應用程序,首先必須明確應用程式的「類別名稱」。 「類別」的概念,Delphi的程式已經非常清楚,如:新建一表單Form1,該表單的「類別名稱」為TForm1。那麼其它Windows程式的「類別名稱」如何確定呢?
值得一喜的是,Delphi提供了一實用工具Winsight,它正如一面照妖鏡,不論何方妖怪,均會顯露出它們的「類名」。
使用Winsight的方法如下:
⑴運行Winsight(程式名稱為ws32.exe,與主檔案delphi32.exe同一目錄),請參閱圖①;
⑵從Winsight的選單中選擇“間諜”中的“跟隨焦點”,見圖②;
⑶運行「計算器」程式;
⑷在Winsight中顯示出了目標,如圖③所示。
軟體環境:中文Win98/中文Delphi5.0。