DOCUMENT:Q195516 31-JUL-1999 [foxpro] TITLE :HOWTO: Make a Form a Topmost Window Using APIs PRODUCT :Microsoft FoxPro PROD/VER: OPER/SYS: KEYWORDS:kbDesigner kbvfp500a kbvfp600 ====================================================================== ------------------------------------------------------------------------------- The information in this article applies to: - Microsoft Visual FoxPro for Windows, versions 5.0a, 6.0 ------------------------------------------------------------------------------- SUMMARY ======= Sometimes you might want to make a form the topmost window on the Windows desktop to prompt a user to perform an action, and, when the user performs the action, return the form to its previous window. This article will demonstrate how to use the FindWindowA and SetWindowPos Application Program Interfaces (APIs). MORE INFORMATION ================ This API method is similar to a system modal window because these APIs make the Visual FoxPro form stay on top of all windows. However, unlike a system modal window, you can still use applications under the topmost form. For example, you could have the form set as a topmost window, but still type into a WordPad document. When you use the FindWindowA API, it returns a non- zero number if the window handle is found. In addition, this approach works well regardless of the form's ShowWindow property setting (that is, in- screen, in top-level form, or as top-level form). 1. Create a form and add four command buttons to the form. For example: "Get Window Handle" "Make Topmost Window" "Restore Window State" "Quit" 2. Add the following two properties to the form: frmcaption formhandle 3. In the Load event of the form add the following code: THISFORM.frmcaption = THIS.CAPTION && Get the window caption. 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 4. In the Click event of the first command button "Get Window Handle," add the following code: THISFORM.formhandle = 0 * If you want to use the class for the application, * use Fox_4000001 for VFP 3 and 5 or VFP66400000 for VFP 6. * For example, * THISFORM.formhandle = ; * FindWindowA("VFP66400000", THISFORM.frmcaption) * Pass a 0 to class to search for all child windows * Be sure the form name is unique though. * The FindWindowA API returns a non-zero number if the * child window is found. THISFORM.formhandle = FindWindowA(0,THISFORM.frmcaption) IF THISFORM.formhandle = 0 =MESSAGEBOX("Unable to get window handle.") ELSE =MESSAGEBOX("Found the window. The handle is "; +ALLTRIM(STR(THISFORM.formhandle))) ENDIF 5. In the Click event of the second command button, "Make Topmost Window," add the following code: IF THISFORM.formhandle = 0 =MESSAGEBOX("You have not obtained a handle to the windows yet") RETURN ENDIF swp_nosize = 1 swp_nomove = 2 hwnd_topmost = -1 hwnd_notopmost = -2 lretval=0 lretval = SetWindowPos(THISFORM.formhandle,hwnd_topmost,; 0,0,0,0,swp_nosize+swp_nomove) 6. In the Click event of the third command button, "Restore Window State," add the following code: IF THISFORM.formhandle = 0 =MESSAGEBOX("You have not obtained a handle to the windows yet") RETURN ENDIF swp_nosize = 1 swp_nomove = 2 hwnd_topmost = -1 hwnd_notopmost = -2 * Call the SetWindowPos API to return form to prior window state lretval=0 lretval = SetWindowPos(THISFORM.formhandle,hwnd_notopmost,; 0,0,0,0,swp_nosize+swp_nomove) 7. In the Quit command button, add the following code: THISFORM.RELEASE 8. Change the form's desktop property to .T. Test the code: 1. Run the form. 2. Click the command button "Get Window Handle" to get the handle to the form. 3. To make the form the topmost window on the desktop, click the "Make Topmost Window" command button. 4. Start or switch to another Windows application. RESULT: Notice how this form stays on top of the other application even when you click on that other application. Now click the "Restore Window State" command button and click the another Windows application. The other application will come forward and the form will be behind this window. REFERENCES ========== "PC Magazine's Visual Basic Programmer's Guide to the Windows API" by Daniel Appleman, published by Ziff-Davis Press, pages 215 and 243. (c) Microsoft Corporation 1998, All Rights Reserved. Contributions by Dean Christopher, Microsoft Corporation. Additional query words: ====================================================================== Keywords : kbDesigner kbvfp500a kbvfp600 Technology : kbVFPsearch kbAudDeveloper kbVFP600 kbVFP500a Issue type : kbhowto ============================================================================= THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY. Copyright Microsoft Corporation 1999.