Results 1 to 8 of 8

Thread: FindWindow help!

  1. #1

    Thread Starter
    New Member
    Join Date
    Aug 2001
    Posts
    8

    FindWindow help!

    hello,
    i want to use FindWindow in conjunction with PostMessage to be able to write a Closewindow type function. However, I really really don't understand either of the arguments you pass to FindWindow. Using the window title is unreliable to me, since it changes with each document that you open. (I'm trying to close something like Microsoft Word). And I don't know what the other argument (the first?) is. can anybody help me?
    thx
    j

  2. #2
    Megatron
    Guest
    It's the classname, which is a constant (unlike the title which is variable). You can get the classname of an App, by using a tool such as Spy++. I believe the classname for Word is OpusApp.

  3. #3
    Registered User Nucleus's Avatar
    Join Date
    Apr 2001
    Location
    So that's what you are up to ;)
    Posts
    2,530
    To close an application, once you have the hwnd, use this code:

    VB Code:
    1. Option Explicit
    2.  
    3. Private Declare Function SendMessageTimeout Lib "user32" Alias "SendMessageTimeoutA" (ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long, ByVal fuFlags As Long, ByVal uTimeout As Long, lpdwResult As Long) As Long
    4. Private Const SC_CLOSE = &HF060&
    5. Private Const WM_SYSCOMMAND = &H112
    6.  
    7.  
    8. Private Declare Function IsWindow Lib "user32" (ByVal hwnd As Long) As Long
    9. Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    10. Const PROCESS_ALL_ACCESS = &H1F0FFF
    11.  
    12. Private Declare Function TerminateProcess& Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long)
    13. Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
    14. Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    15.  
    16.  
    17. Sub CloseWindowByHwnd(ByVal hwnd&)
    18. 'Nucleus
    19.     Dim lPid                    As Long
    20.     Dim lHp                     As Long
    21.  
    22.     SendMessageTimeout hwnd, WM_SYSCOMMAND, SC_CLOSE, 0, 0, 500, 0
    23.     '
    24.     ' If the window doesn't like gentle persuasion, bring out the nipple clamps to force it to close
    25.     '
    26.     If IsWindow(hwnd) Then
    27.         Call GetWindowThreadProcessId(hwnd, lPid)
    28.         lHp = OpenProcess(PROCESS_ALL_ACCESS, 0&, lPid)
    29.         TerminateProcess lHp&, 0&
    30.         CloseHandle lHp
    31.     End If
    32.     '
    33. End Sub

  4. #4

    Thread Starter
    New Member
    Join Date
    Aug 2001
    Posts
    8
    thx nucleus and megatron...
    nucleus, the postmessage method i've seen is shorter than yours, but yours seems more thorough-- i'll check it out.

    and another question--
    i just realized that ShellExecute returns a value-- is the return value the same value (ie the windowhandle) returned by FindWindow?

    thx
    j

  5. #5
    Registered User Nucleus's Avatar
    Join Date
    Apr 2001
    Location
    So that's what you are up to ;)
    Posts
    2,530
    See here for more info if you want to return PID from shellexecute:

    http://www.vbforums.com/showthread.p...ELLEXECUTEINFO

  6. #6
    Megatron
    Guest
    Assuming that no errors occur, ShellExecute returns the instance handle of the application that was run.

  7. #7

    Thread Starter
    New Member
    Join Date
    Aug 2001
    Posts
    8
    megatron, so i should be able to use something like GetWindowTextLength with the ShellExecute return as an argument, right? But I'm running my test program line by line, and ShellExecute returns a value like 33 or 42, and passing that (which *is* the hwnd of the window resulting from ShellExecute, right? i'll feel so stupid if it's not) to GetWindowTextLength returns a 0, which shouldn't happen. what's wrong?

  8. #8
    Registered User Nucleus's Avatar
    Join Date
    Apr 2001
    Location
    So that's what you are up to ;)
    Posts
    2,530
    *ahem* the link I posted shows you how to get the Process ID for ShellExecute which is the same as the number from Shell.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width