// ==================================================
// DLL-библиотека DLLDemo.DLL
// Поиск окна по заданному заголовку
//
// (С) Фролов А.В., 1996
// Email: frolov@glas.apc.org
// ==================================================

#include <windows.h>
#include <windowsx.h>
#include "dlldemo.h"

// Глобальная переменная, в которую записывается
// идентификатор найденного окна или значение NULL, 
// если окно с заданным заголовком не найдено
HWND hwndFinded;

// -------------------------------------------------
// Функция DLLEntryPoint
// Точка входа DLL-библиотеки
// -------------------------------------------------
BOOL WINAPI DLLEntryPoint(
  HMODULE hModule,      // идентификатор модуля
  DWORD   fdwReason,    // причина вызова функции DLLEntryPoint
  LPVOID  lpvReserved)  // зарезервировано
{
  switch(fdwReason)
  {
    // Подключение нового процесса
    case DLL_PROCESS_ATTACH:
    {
      MessageBox(NULL, "Process attached", "DLL Demo", MB_OK);
      break;
    }

    // Подключение новой задачи
    case DLL_THREAD_ATTACH:
    {
      MessageBox(NULL, "Thread attached", "DLL Demo", MB_OK);
      break;
    }

    // Отключение процесса
    case DLL_PROCESS_DETACH:
    {
      MessageBox(NULL, "Process detached", "DLL Demo", MB_OK);
      break;
    }

    // Отключение задачи
    case DLL_THREAD_DETACH:
    {
      MessageBox(NULL, "Thread detached", "DLL Demo", MB_OK);
      break;
    }
  }
  return TRUE;
}

// -------------------------------------------------
// Функция FindApplicationWindow
// Поиск главного окна приложения по его заголовку
// -------------------------------------------------
HWND FindApplicationWindow(LPSTR lpszWindowTitle)
{
  // Запускаем цикл поиска окна с заголовком,
  // адрес которого передан функции через
  // параметр lpszWindowTitle
  EnumWindows(EnumWindowsProc, (LPARAM)lpszWindowTitle);
      
  // Возвращаем значение глобальной переменной hwndFinded,
  // которое устанавливается функцией обратного вызова
  // EnumWindowsProc в зависимости от результата поиска
  return hwndFinded;
}


// -------------------------------------------------
// Функция EnumWindowsProc
// -------------------------------------------------
BOOL CALLBACK EnumWindowsProc(
  HWND   hwnd,   // идентификатор родительского окна
  LPARAM lParam) // адрес строки заголовка окна
{
  // Буфер для хранения заголовка окна
  char szBuf[512];

  // Получаем заголовок окна
  GetWindowText(hwnd, szBuf, 512);
  
  // Сравниваем заголовок со строкой, адрес которой 
  // передан в функцию EnumWindowsProc через параметр lParam
  if(!strcmp((LPSTR)lParam, szBuf))
  {
    // Если заголовок совпал, сохраняем идентификатор
    // текущего окна в глобальной переменной hwndFinded
    hwndFinded = hwnd; 
    
    // Завершаем цикл просмотра окон
    return FALSE;
  }
  
  // Если заголовок не совпал, продолжаем поиск
  else
  {
    // Записываем в глобальную переменную hwndFinded
    // значение NULL. Это признак того, что окно
    // с заданным заголовком не было найдено
    hwndFinded = NULL;    

    // Для продолжения поиска возвращаем значение TRUE
    return TRUE;
  }
}


