การใช้งาน Window API

Window API เป็นฟังก์ชันภายนอกชนิดหนึ่งที่มีมาพร้อมกับระบบปฎิบัติการ Windows ที่เราใช้กันอยู่อย่างแพร่หลายในขณะนี้ ซึ่งก็คล้ายๆกับฟังก์ชันของ Visual FoxPro อันที่จริงแล้วฟังก์ชันภายนอกต่างๆนั้นมีอยู่มากมายที่ถูกสร้างขึ้นมา ไม่ว่าจะเป็น Active X Control, ฟังก์ชันที่สร้างขึ้นโดยใช้ภาษา C แล้ว Compile เป็นไฟล์ .DLL (Dynamic Link Library) , Visual FoxPro External Library ไฟล์ .FLL   ซึ่งทั้งหมดที่กล่าวมานี้เราจะเรียกฟังก์ชันหรือโปรแกรมเหล่านั้นว่า API (Application Programming Interface) ทั้งสิ้น

มีความจำเป็นด้วยหรือที่เราจะต้องใช้คำสั่ง Window API ?

ในการเขียนระบบงานหรือโปรแกรมขึ้นนั้นเราไม่จำเป็นต้องเรียกใช้งานฟังก์ชันของ Window API ก็ได้ แต่เพื่อเป็นการเพิ่มประสิทธิภาพของโปรแกรมหรือเมื่อโปรแกรมของคุณต้องมีการติดต่อระหว่างระบบปฎิบัติการ คุณก็สามารถทำการเรียกใช้งานฟังก์ชันต่างๆเหล่านั้นได้ตามความเหมาะสม

สำหรับระบบปฎิบัติการ Windows ได้เตรียมฟังก์ชัน API   ไว้ให้โดยจะบรรจุอยู่ภายใต้ System Directory ่ในรูปของไฟล์ที่มีนามสกุล .DLL ไฟล์เหล่านั้นได้แก่ Kernal32.DLL, Gdi32.DLL, User32.DLL, Mpr.DLL และ Advapi32.DLL เป็นต้น

ในระยะแรกๆผู้เขียนเคยประสบปัญหาในการอ่านคู่มือคำสั่ง Windows API จากแหล่งต่างๆเท่าที่จะหาได้เนื่องจากรูปแบบคำสั่งและตัวอย่างการใช้งานนั้นเขียนขึ้นโดยใช้ ภาษา Visual Basic เป็นหลัก ได้แต่นึกในใจว่าทำไม่ทาง Microsoft ถึงไม่ยอมยกตัวอย่างที่เขียนในรูปแบบของ Visual FoxPro บ้าง ก็เลยฉุกคิดได้ว่า Visual Baisc เป็นลูกแท้ๆของ Microsoft ส่วน Visual FoxPro เป็นแค่ลูกบุญธรรม ใครจะสำคัญกว่ากัน?   แต่พอทำการเขียนฟังก์ชัน API โดยใช้ Visual FoxPro กับเขียนฟังก์เหล่านั้นได้ง่ายกว่า Visual Basic อีกครับท่าน

การเรียกใช้งานฟังก์ชันจากภายนอก

คำสั่งที่ใช้ในการเรียกใช้งานฟังก์ชันจากภายนอก (ไฟล์ที่มีนามสกุล .DLL) มีรูปแบบในการเรียกใช้ดังนี้

DECLARE [cFunctionType] FunctionName IN LibraryName [AS AliasName]
[ cParamType1 [@] ParamName1,
cParamType2 [@] ParamName2, …]

การเรียกใช้งานโดยใช้คำสั่ง DECLARE จะเป็นการรีจิสเตอร์(Register) ฟังก์ชันให้ Visual FoxPro ทราบเท่านั้น ยังไม่ได้เป็นการเรียกใช้งานจริง

ถ้าผมจะอธิบายรูปแบบคำสั่งตอนนี้ท่านผู้อ่านทั้งหลายคงต้องงงเป็นแน่แท้ (เหมือนผมตอนเริ่มใหม่ๆ) ผมจะขอยกตัวอย่างการเรียกใช้โดย Visual Basic แล้วนำมาเปรียบเทียบกันดู เผื่อท่านไปพบเห็นตัวอย่างการใช้งานฟังก์ชันที่เขียนด้วย Visual Basic จะได้นำกลับมาเขียนใน Visual FoxPro ได้อย่างสะดวกโยธิน

ตัวอย่างการดึงชื่อ User Name ในระบบปฎิบัติการ Windows

Visual Basic เขียนคำสั่งดังนี้

Private Declare Function GetUserName Lib “kernel32” Alias “UserName” (ByVal lpBuffer As String, nSize As Long) As Long

Visual FoxPro เขียนคำสั่งดังนี้

DECLARE Long GetUserName IN Win32API AS UserName String @lpBuffer , Long @nSize

เห็นไหมครับว่า Visual FoxPro เขียนคำสั่งได้ง่ายและสั้นกว่าตั้งเยอะ

อธิบายรูปแบบคำสั่ง

Visual FoxPro

Visual Basic

DECLARE DECLARE Private Declare Function เป็นคำสั่งที่ใช้ในการ Register ฟังก์ชัน API
[FunctionType] Long As Long เป็นชนิดของค่าที่ส่งกลับเมื่อเรียกใช้งานฟังก์ชัน ค่าที่ส่งกลับได้มีดังนี้

SHORT 16-bit integer
INTEGER 32-bit integer
SINGLE 32-bit floating point
DOUBLE 64-bit floating point
LONG 32-bit long integer
STRING Character string
FunctionName GetUserName GetUserName ชื่อฟังก์ชันของ Windows API ต้องป้อนตัวอักษรใหญ่เล็กให้ถูกต้องตามที่กำหนด
IN LibraryName IN Win32API Lib “kernel32” เป็นการเรียกใช้ฟังก์ชันจากไฟล์ใด สำหรับ Visual FoxPro นั้นจะใช้ชื่อ Win32API แทน ไฟล์เหล่านี้ทั้งหมด Kernal32.DLL, Gdi32.DLL, User32.DLL, Mpr.DLL และ Advapi32.DLL
AS [Alias] AS UserName Alias “UserName” กำหนดชื่อในการเรียกใช้งานแทนชื่อฟังก์ชันเดิม
cParameterType1 String As String เป็นชนิดของค่าที่ใช้สำหรับนำเข้า หรือส่งกลับเมื่อเรียกใช้งานฟังก์ชัน
ParamName1 @lpBuffer ByVal lpBuffer ตัวแปรที่ใช้ในการส่งค่าเข้าและออก
cParameterType2 Long As Long เป็นชนิดของค่าที่ใช้สำหรับนำเข้า หรือส่งกลับเมื่อเรียกใช้งานฟังก์ชัน
ParamName2…. @lnSize ByVal lpSize ตัวแปรที่ใช้ในการส่งค่าเข้าและออก…

หมายเหตุ   ในกรณีที่ใส่เครื่องหมาย @ ไว้หน้าตัวแปรหมายความว่าตัวแปรที่ส่งเข้าไปในฟังก์ชันนั้นจะมีการส่งผลลัพธ์กลับมาให้ด้วย

การแสดงรายชื่อฟังก์ชันที่ได้ทำการ Register

เมื่อเราทำการ Register ฟังก์ชันต่างๆแล้ว ถ้าเราต้องการทราบว่ามีฟังก์ชันใดถูก Register แล้วบ้างเราสามารถทำการเรียกดูได้โดยใช้คำสั่ง

DISPLAY DLLS

หรือ    LIST DLLS

การล้างค่าฟังก์ชันที่ได้ทำการ Register

เมื่อต้องการล้างค่าฟังก์ชันที่ได้ Register ไปแล้วสามารถทำได้โดยใช้คำสั่ง

CLEAR DLLS

การใช้คำสั่ง CLEAR DLLS จะเป็นการล้างค่าฟังก์ชันที่มีการ Register ไว้ออกทั้งหมด

การนำคำสั่ง Windows API ไปใช้งาน

ในช่วงแรกๆที่ได้ทำการศึกษาการใช้งาน Windows API นั้นผู้เขียนลองทำตามขั้นตอนต่างๆโดยแปลงคำสั่งจาก Visual Basic มาเป็น Visual FoxPro ทุกอย่างทำได้หมด เอ…แต่ผลลัพธ์ทำไมไม่ยักออก ลองอยู่หลายครั้งหลายหนก็ไม่สามารถทำได้ จนกระทั่งได้ไปค้นเจอว่าการนำค่าที่ส่งกลับมาจากการเรียกใช้งานฟังก์ชัน API นั้นค่าที่ส่งกลับบางชนิดสามารถนำมาใช้งานได้ทันที แต่ค่าบางชนิดต้องมากระทำการบางอย่างเพื่อให้มีค่าจริงๆที่เราสามารถนำไปใช้ได้อย่างถูกต้อง

ให้คุณลองศึกษาจากตัวอย่าง โดยการสร้างโปรแกรมชื่อ GETUSER.PRG โดยพิมพ์คำสั่งที่ Command Window ดังนี้

MODIFY COMMMAND GETUSER.PRG

แล้วพิมพ์คำสั่งตามตัวอย่าง

** Program: Getuser.prg **
** Purpose: Demonstrates how to use and call the Win32 **
** GetUserName API. **

RetVal = 0
lpUserIDBuffer = SPACE(256) && Return buffer for user ID string
nBufferSize = 256 && Size of user ID return buffer

DECLARE INTEGER GetUserName IN Win32API AS UserName ;
STRING @lpUserIDBuffer, ;
INTEGER @nBufferSize

RetVal=UserName(@lpUserIDBuffer, @nBufferSize)
? RetVal && ถ้าฟังก์ชันทำไม่สำเร็จจะส่งค่ากลับเป็น 0
? “Value in lpUserIDBuffer : ” + lpUserIDBuffer
? “Value in nBufferSize : ” + STR(nBufferSize)
? “User ID : ” + LEFT(lpUserIDBuffer,nbuffersize-1)
CLEAR DLLS
** End Program

ทำการบันทึกโปรแกรมโดยกดปุ่ม Ctrl + W
จากนั้นทำการเรียกโปรแกรมโดยพิมพ์คำสั่ง DO GETUSER ที่ Command Window แล้วสังเกตผลลัพท์ที่เกิดขึ้น

จะสังเกตได้ว่าคำสั่ง ? “Value in lpUserIDBuffer : ” + lpUserIDBuffer จะได้ชื่อ user name กลับมาแต่จะมีค่า null ต่อท้ายมาให้ด้วยอีก 1 ตัว

การใช้งานคำสั่ง Windows API ในลักษณะต่างๆ

สำหรับตัวอย่างที่จะนำเสอนต่อไปนี้ท่านสามารถนำใปใช้งานได้เลยทันที…ตามความประสงค์

การใช้งานฟังก์ชัน GetVolumnInformation

ฟังก์ชันนี้จะเป็นการแสดงข้อมูลข่าวสารของ Volumn ใน Disk
สำหรับผมจะใช้ค่าที่ได้จาก VolumnSerialNumber โดยนำไปใช้เป็นตัว Lock ไม่ให้ผู้อื่นนำโปรแกรมเราไปลงเครื่องอื่นได้อีก

**—————————————————————**
** Program: Getvol.prg **
** Purpose: Demonstrates how to declare and use the Win32 **
** GetVolumeInformation API. **
**—————————————————————**

lpRootPathName = “c:\” && Drive and directory path
lpVolumeNameBuffer = SPACE(256) && lpVolumeName return buffer
nVolumeNameSize = 256 && Size of/lpVolumeNameBuffer
lpVolumeSerialNumber = 0 && lpVolumeSerialNumber buffer
lpMaximumComponentLength = 256
lpFileSystemFlags = 0
lpFileSystemNameBuffer = SPACE(256)
nFileSystemNameSize = 256

DECLARE INTEGER GetVolumeInformation IN Win32API AS GetVolInfo ;
STRING @lpRootPathName, ;
STRING @lpVolumeNameBuffer, ;
INTEGER nVolumeNameSize, ;
INTEGER @lpVolumeSerialNumber, ;
INTEGER @lpMaximumComponentLength, ;
INTEGER @lpFileSystemFlags, ;
STRING @lpFileSystemNameBuffer, ;
INTEGER nFileSystemNameSize

RetVal=GetVolInfo(@lpRootPathName, @lpVolumeNameBuffer, ;
nVolumeNameSize, @lpVolumeSerialNumber, ;
@lpMaximumComponentLength, @lpFileSystemFlags, ;
@lpFileSystemNameBuffer, nFileSystemNameSize)

**————————————————————–**
** Because several of the return values are padded with a null **
** terminator, you will need to strip off the null terminator **
** in order to get the correct value, which is what is done **
** using the LEFT, ALLTRIM, and LEN functions. **
**————————————————————–**
? “Drive & path name : ” + ;
ALLTRIM(lpRootPathName)
? “Volume name : ” + ;
LEFT(ALLTRIM(lpVolumeNameBuffer),LEN(ALLTRIM(lpVolumeNameBuffer))-1)
? “Max #/chars in vol name : ” + ;
ALLTRIM(STR(nVolumeNameSize))
? “Volume Serial # : ” + ;
ALLTRIM(STR(lpVolumeSerialNumber))
? “Max #/chars in dir/file names: ” + ;
ALLTRIM(STR(lpMaximumComponentLength))
? “File System Flags : ” + ;
ALLTRIM(STR(lpFileSystemFlags))
? “File System type : ” + ;
LEFT(ALLTRIM(lpFileSystemNameBuffer), ;
LEN(ALLTRIM(lpFileSystemNameBuffer))-1)
? “File Sys Name Size : ” + ;
ALLTRIM(STR(nFileSystemNameSize))
CLEAR DLLS
** End Program

การใช้งานฟังก์ชัน GetSystemDirectory

เป็นฟังก์ชันที่ใช้ในการหา System Directory ของระบบปฎิบัติการ Windows เนื่องจากในการ ติดตั้ง โปรแกรม Windows ผู้ติดตั้งสามารถจะกำหนดชื่อ System Directory ให้กับระบบปฎิบัติการได้เอง ดังนั้นถ้าเราต้องการทราบว่าชื่ออะไรเราต้องใช้ฟังก์ชันตามตัวอย่างในการค้นหา ดังนี้

**—————————————————————**
** Program: GetSysDir.prg **
** Purpose: Demonstrates how to declare and use the Win32 **
** GetSystemDirectory API. **
**—————————————————————**

lsSysDir = SPACE(256) && MAX_PATH, the maximum path length
liSize = 256
DECLARE INTEGER GetSystemDirectory IN Win32API ;
STRING @lsSysDir, ;
INTEGER liSize

liRet = GetSystemDirectory(@lsSysDir, liSize)
? “Size of Data : ” + STR(liRet)    && ถ้าฟังก์ชันทำไม่สำเร็จจะส่งค่ากลับเป็น 0
? “Windows System Directory : ” + LEFT(lsSysDir,liRet)
CLEAR DLLS
** End Program

การใช้งานฟังก์ชัน GetTempPath

เป็นฟังก์ชันที่ใช้ในการหา Tempolary Directory ของระบบปฎิบัติการ Windows

**—————————————————————**
** Program: GetTempDir.prg **
** Purpose: Demonstrates how to declare and use the Win32 **
** GetTempPath API. **
**—————————————————————**
lsSysDir = SPACE(256) && MAX_PATH, the maximum path length
liSize = 256

DECLARE INTEGER GetTempPath IN Win32API ;
INTEGER liSize, ;
STRING @lsSysDir

liRet = GetTempPath(liSize, @lsSysDir)
? “Size of Data : ” + STR(liRet)  && ถ้าฟังก์ชันทำไม่สำเร็จจะส่งค่ากลับเป็น 0
? “Windows Tempolary Directory : ” + LEFT(lsSysDir,liRet)
CLEAR DLLS
** End Program

การใช้งานฟังก์ชัน ExitWindowsEx

เป็นฟังก์ชันที่ใช้สั่งให้ทำการ ใช้สำหรับสั่งให้เครื่อง Boot, Restart หรือ Log off ระบบปฎิบัติการ Windows จากโปรแกรม

**—————————————————————**
** Program: WinExit.prg **
** Purpose: Demonstrates how to declare and use the Win32 **
** ExitWindowsEx API. **
**—————————————————————**
uFlags = 0
* uFlags ข้อมูลชนิด INTEGER ที่ใช้สำหรับกำหนดหน้าที่ให้ฟังก์ชัน ExitWindowsEx ( ) สามารถมีค่าได้ดังนี้
*     0    เมื่อต้องการ สั่งให้ Log Off ออกจากระบบเครือข่าย
*    1    เมื่อต้องการ สั่งให้ Shutdown เครื่อง
*    2     เมื่อต้องการสั่งให้ Restart เครื่องใหม่
*    4     เมื่อต้องการออกจาก Windows โดยทันที (Force)
dwReserved = 0
DECLARE INTEGER ExitWindowsEx IN Win32API AS ExitWindows INTEGER @uFlags , INTEGER dwReserved

RetVal = ExitWindows(@uFlags, dwReserved)

CLEAR DLLS
** End Program

การใช้งานฟังก์ชัน SHGetSpecialFolderPath

เป็นฟังก์ชันที่ใช้ในการค้นหา Special Folder ของ Windows

**—————————————————————**
** Program: FinFolder.prg **
** Purpose: Demonstrates how to declare and use the SHELL32 **
** SHGetSpecialFolderPath API. **
**—————————————————————**
*** Define Special Folder Constants
#define CSIDL_PROGRAMS 2 &&Program Groups Folder
#define CSIDL_PERSONAL 5 &&Personal Documents Folder
#define CSIDL_FAVORITES 6 &&Favorites Folder
#define CSIDL_STARTUP 7 &&Startup Group Folder
#define CSIDL_RECENT 8 &&Recently Used Documents
#define CSIDL_SENDTO 9 &&Send To Folder
#define CSIDL_STARTMENU 11 &&Start Menu Folder
#define CSIDL_DESKTOPDIRECTORY 16 &&Desktop Folder
#define CSIDL_NETHOOD 19 &&Network Neighborhood Folder
#define CSIDL_TEMPLATES 21 &&Document Templates Folder
#define CSIDL_COMMON_STARTMENU 22 &&Common Start Menu Folder
#define CSIDL_COMMON_PROGRAMS 23 &&Common Program Groups
#define CSIDL_COMMON_STARTUP 24 &&Common Startup Group Folder
#define CSIDL_COMMON_DESKTOPDIRECTORY 25 &&Common Desktop Folder
#define CSIDL_APPDATA 26 &&Application Data Folder
#define CSIDL_PRINTHOOD 27 &&Printers Folder
#define CSIDL_COMMON_FAVORITES 31 &&Common Favorites Folder
#define CSIDL_INTERNET_CACHE 32 &&Temp. Internet Files Folder
#define CSIDL_COOKIES 33 &&Cookies Folder
#define CSIDL_HISTORY 34 &&History Folder

cSpecialFolderPath = space(255)

DECLARE SHGetSpecialFolderPath IN SHELL32.DLL ;
AS GetFolder LONG hwndOwner, ;
STRING @cSpecialFolderPath, ;
LONG nWhichFolder

*** เช่นต้องการค้นหา StartUp  Folder ว่าอยู่ ณ.ที่ใด เราจะใช้ตัวแปร CSIDL_STARTUP ซึ่งมีค่าเท่ากับ 7
GetFolder(0, @cSpecialFolderPath, CSIDL_STARTUP)

?SubStr(RTrim(cSpecialFolderPath),1, Len(RTrim(cSpecialFolderPath))-1)

CLEAR DLLS
** End Program

 

การใช้งานฟังก์ชัน FindExecutable

เป็นฟังก์ชันที่ใช้ในการค้นหาชื่อไฟล์ที่ต้องการ แล้วแสดง Folder ที่ไฟล์นั้นๆบรรจุอยู่

**—————————————————————**
** Program: FindFile.prg **
** Purpose: Demonstrates how to declare and use the SHELL32 **
** FindExecutable API. **
**—————————————————————**
lpFile = “NOTEPAD.EXE”
lpDirectory = ”
lpResults = SPACE(128)

DECLARE INTEGER FindExecutable IN SHELL32 ;
STRING@lpFile, STRING@lpDirectory, ;
STRING @lpResults

liReturnValue = FindExecutable(@lpFile, @lpDirectory,@lpResults)
* ในกรณีที่ทำการค้นหาแล้วไม่พบ IiReturnValue จะมีค่าดังนี้
* 0         = Out of memory or resources
* 31    = No association for file type
* 2        = Specified file not found
* 3        = Specified path not found
* 11    = Invalid EXE format
?liReturnValue
lpResults = LEFT(lpResults, AT(CHR(0), lpResults) – 1)

? “Full path of application: ” + lpResults

CLEAR DLLS
** End Program

การใช้งานฟังก์ชัน MessageBeep

เป็นฟังก์ชันที่ใช้ในการส่งเสียนเตือน เหมือนกับ คำสั่ง ? CHR(7) แต่คุณสามารถที่จะนำเสียงจาก Sound ของ Windows มาใช้ได้
โดยเสียงต่างๆคุณสามารถเข้าไปกำหนดใน Control Panel ในส่วนของ Sounds

**—————————————————————**
** Program: Beep.prg **
** Purpose: Demonstrates how to declare and use the WIN32API **
** MessageBeep API. **
**—————————————————————**
#DEFINE MB_OK 0                                            && Default Sound
#DEFINE MB_ICONHAND 16                        && Certical Stop
#DEFINE MB_ICONQUESTION 32              && Question
#DEFINE MB_ICONEXCLAMATION 48      && Exclamation
#DEFINE MB_ICONASTERISK 64                && Asterisk
DECLARE INTEGER MessageBeep IN Win32API INTEGER
=MessageBeep(MB_OK)
CLEAR DLLS
** End Program

การกำหนดหน้าต่างให้อยู่บนสุดของ Windows(Topmost Window)

ในสมัยที่เรายังใช้ระบบปฎิบัติการ DOS เราจะไม่ค่อยจะมีปัญหาเกี่ยวกับการใช้งานโปรแกรมสักเท่าได เนื่องจากว่าเมื่อทำการเรียกโปรแกรมขึ้นมาแล้ว เราจะต้องใช้งานโปรแกรมนั้นจนเสร็จ แล้วออกจากโปรแกรมดังกล่าวก่อน จึงจะสามารถทำงานหรือเรียกโปรแกรมอื่นๆต่อไปได้(ยกเว้นโปรแกรมประเภทฝังตัว)   แต่พอมาถึงยุคของระบบปฎิบัติการ Windows งานหลายๆงานสามารถเปิดใช้งานได้พร้อมๆกัน ซึ่งก็เป็นข้อดีของระบบปฎิบัติการ Windows แต่ผมเป็นพวกหัวโบราณก็เลยอยากให้ผู้ใช้ เมื่อเข้าสู่โปรแกรมที่ผมสร้างขึ้นมาด้วย Visual FoxPro ใช้แต่โปรแกรมของผมจนกระทั่งออกจากโปรแกรมโดยที่ไม่สามารถใช้โปรแกรมตัวอื่นๆได้เลยไม่ว่าจะเป็น Word , Excel เป็นต้น ดังนั้นจึงเป็นที่มาของ ฟังก์ชันที่ผมจะนำเสนออยู่นี้

ฟังก์ชันที่จะนำเสนอนี้เป็นฟังก์ชันที่กำหนดให้ หน้าต่างหรือฟอร์มที่เราต้องการ กำหนดให้อยู่บนสุดของ Window เสมอ (Topmost Window)

ให้คุณทำการสร้างฟังก์ชันตามตัวอย่างต่อไปนี้

**—————————————————————**
** Program: topwindow.prg **
** Purpose: Demonstrates how to declare and use the WIN32API **
** FindWindowA API. **
** SetWindowPos API. **
**—————————————————————**
FUNCTION TOPWINDOW
PARA cCaption, lStatus

DECLARE LONG FindWindowA IN WIN32API ;
STRING class, ;
STRING title

DECLARE SetWindowPos IN WIN32API ;
LONG HWND, ;
LONG hwndafter, ;
LONG x, ;
LONG Y, ;
LONG cx, ;
LONG cy, ;
LONG flags
formhandle = 0
formhandle = FindWindowA(0,cCaption)
IF formhandle = 0
=MESSAGEBOX(“ไม่พบ window ที่ต้องการ”)
ELSE
swp_nosize = 1
swp_nomove = 2
hwnd_topmost = -1
hwnd_notopmost = -2
lretval=0
IF lStatus
lretval = SetWindowPos(formhandle,hwnd_topmost,;
0,0,0,0,swp_nosize+swp_nomove)
ELSE
lretval = SetWindowPos(formhandle,hwnd_notopmost,;
0,0,0,0,swp_nosize+swp_nomove)
ENDIF
ENDIF
CLEAR DLLS
RETURN

ตัวอย่างการใช้งาน ให้คุณป้อนคำสั่งต่อไปนี้ที่ Command Window

_Screen.MinButton=.F.
_Screen.MaxButton=.F.
_Screen.WindowState = 2
=TOPWINDOW(_Screen.Caption,.T.)
* _Screen.Caption ใช้สำหรับ Main Visual FoxPro Window
* ในกรณีที่ต้องการหา window อื่นๆ ก็ใช้ ใช้ caption ของ window นั้นๆ

* ถ้าไม่ต้องการให้ผู้ใช้สามารถใช้ Task Bar ได้ ให้กำหนดเป็น Auto Hide

ในกรณีที่ต้องการยกเลิกการกำหนด topmost window ก็ให้ใช้คำสั่งดังนี้

=TOPWINDOW(_Screen.Caption,.F.)

ไว้จะนำมาลงให้อีกครับท่าน…..