What is the FindWindow Function?
The FindWindow function retrieves a handle to the top-level window whose class name and window name match the specified strings.
This function does not search child windows. This function does not perform a case-sensitive search.
Find Window(string lpClassName,string lpWindowName).
Finding ClassName and WindowName using Spy++
Spy++ (SPYXX.EXE) is a Win32-based utility that gives you a graphical view of the system’s processes, threads, windows, and window messages. With the Window Finder Tool, you can find the properties of a selected window.
Step 1. Arrange your windows so that Spy++ and the subject window are visible.
Step 2. From the Spy menu, choose Find Window to open the Find Window dialog box.
Step 3. Drag the Finder Tool to the desired window. As you drag the tool, window details display in the dialog box. (Handle, Caption(Window Name), Class Name).
Example
using System;
using System.Runtime.InteropServices;
public class YourClassName
{
[DllImport("user32.dll")]
public static extern int FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);
public const int WM_SYSCOMMAND = 0x0112;
public const int SC_CLOSE = 0xF060;
private void button1_Click(object sender, EventArgs e)
{
// Retrieve the handler of the window
int iHandle = FindWindow("Notepad", "Untitled - Notepad");
if (iHandle > 0)
{
// Close the window using API
SendMessage(iHandle, WM_SYSCOMMAND, SC_CLOSE, 0);
}
}
}
Closing google window
private void button2_Click(object sender, EventArgs e)
{
// Closing Google window
int googleHandle = FindWindow("IEFrame", "Google - Microsoft Internet Explorer provided by Cognizant");
if (googleHandle > 0)
{
// Close the window using API
SendMessage(googleHandle, WM_SYSCOMMAND, SC_CLOSE, 0);
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
#include "header.h" HWND hWnd, hWnd1, hWnd2; HINSTANCE hInst; BOOL NewWindowClass(WNDPROC Proc, TCHAR szName[],UINT brBackground,UINT icon, UINT cursor, UINT menu) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = Proc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInst; wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION); wcex.hCursor = LoadCursor(hInst,(LPCSTR) NULL); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = (LPCSTR)menu; wcex.lpszClassName = szName; wcex.hIconSm = LoadIcon(hInst,(LPCSTR) NULL); if (!RegisterClassEx(&wcex)) { MessageBox(NULL, _T("Call to RegisterClassEx failed!"), _T("Win32 Guided Tour"), NULL); return 1; } } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { hInst = hInstance; if (!NewWindowClass(WndProc,szWindowClass,COLOR_WINDOW,IDI_ICON1,IDC_CURSOR1,NULL)) return FALSE; if (!NewWindowClass(WndProc1,WinClass1,COLOR_WINDOW,IDI_ICON1,IDC_CURSOR1,IDR_MENU1)) return FALSE; if (!NewWindowClass(WndProc2,WinClass2,COLOR_WINDOW,IDI_ICON1,IDC_CURSOR1,IDR_MENU1)) return FALSE; hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 150, 150, x, y, NULL, NULL, hInst, NULL); if (!hWnd) { MessageBox(NULL, ("Call to CreateWindow failed!"), ("Win32 Guided Tour"), NULL); return 1; } ShowWindow(hWnd,nCmdShow); UpdateWindow(hWnd); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { if(!TranslateAccelerator(hWnd, hw, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hButton_00_01; // дескриптор для кнопоки static int x0=150,y0=150; switch (message) { case WM_CREATE: { hButton_00_01 = CreateWindow("button", "Вестерос", WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON, 50, 20, 160, 50, hWnd, (HMENU)ID_BUTTON_00_01, hInst, NULL); return 0; } case WM_COMMAND: { switch(LOWORD(wParam)) { case ID_BUTTON_00_01: { if (!IsWindow (hWnd1)) { hWnd1 = CreateWindow(WinClass1,("window"),WS_OVERLAPPEDWINDOW|WS_VISIBLE,x0,y0,x,y,NULL,NULL,hInst,NULL); } return 0; } } } case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); break; } return 0; } LRESULT CALLBACK WndProc1(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static int x0=150,y0=150; switch (message) { case WM_COMMAND: { switch(LOWORD(wParam)) { case ID_TEMPLATE: MessageBox(hWnd, "window", "window", MB_OK); if (!IsWindow (hWnd2)) { hWnd2 = CreateWindow(WinClass2,("new_window"),WS_OVERLAPPEDWINDOW|WS_VISIBLE,x0,y0,x,y,NULL,NULL,hInst,NULL); } return 0; } } default: return DefWindowProc(hWnd, message, wParam, lParam); break; } } LRESULT CALLBACK WndProc2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static int x0=150,y0=150; switch (message) { case WM_COMMAND: { switch(LOWORD(wParam)) { case ID_TEMPLATE: MessageBox(hWnd, "new_window", "new_window", MB_OK); return 0; } } default: return DefWindowProc(hWnd, message, wParam, lParam); break; } } |
Итак, задача простая. Необходимо программно закрыть приложение. Например, Калькулятор из стандартной поставки Windows. Вообщем нам надо просто послать калькулятору сообщение WM_QUIT. Для этого воспользуемся функцией PostMessage:
PostMessage ( HWND hwnd, // дискриптор окна UINT message, // сообщение WPARAM wParam = 0, // параметры LPARAM lParam = 0 );
Эта функция поставит сообщение в очередь сообщений Windows. Окно естественно до него доберется и выполнит. Одна сложность это как найти дескриптор окна — FindWindow это знакомо. Вот пример, который закроет калькулятор.
// Post.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "windows.h" #include "iostream.h" void main() { PostMessage(FindWindow(NULL, "Калькулятор"), WM_QUIT, 0, 0); }
Соберите программу. Запустите калькулятор, а потом нашу программу. Калькулятор будет закрыт.
Функция CloseWindow
Функция CloseWindow свертывает
(но не разрушает) заданное окно.
Синтаксис
BOOL CloseWindow(
HWND hWnd //
дескриптор окна, которое свертывается
);
Параметры
hWnd
[in] Дескриптор окна, которое
должно быть свернуто
Возвращаемые значения
Если функция завершается успешно, возвращаемое значение — не ноль.
Если функция завершается ошибкой, возвращаемое значение — ноль. Чтобы
получить расширенную информацию об ошибке вызовите функцию GetLastError.
Замечания
Чтобы уничтожить окно, прикладная программа должна использовать функцию DestroyWindow.
Смотри также
Краткий обзор Окна,
ArrangeIconicWindows,
DestroyWindow,
IsIconic,
OpenIcon
Размещение и |
|
Windows. NET Server |
Да |
Windows XP |
Да |
Windows 2000 |
Да |
Windows NT |
Да |
Windows Me |
Да |
Windows 98 |
Да |
Windows 95
|
Да |
Используемая |
User32.lib |
Заголовочный файл |
|
— объявлено в |
Winuser.h |
— включено в |
Windows.h |
Unicode |
Нет |
Замечания по |
Не имеется |