#include "windows.h"
#include "iostream"
#include "cstdlib"
using namespace std;
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
char WindowCaption[255],ClassName[255];
GetWindowText(hwnd,WindowCaption,255);
GetClassName(hwnd,ClassName,255);
cout<<"Caption: "<<WindowCaption<<"; Class: "<<ClassName<<" ; Handle: "<<hwnd<<endl;
return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
EnumWindows((WNDENUMPROC)EnumWindowsProc,0);
system("pause");
return 0;
}
Монитор окон
P.S.: Я программирую на языке C#.
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Threading;
namespace API
{
public class ThreadClass
{
[DllImport("user32.dll", EntryPoint = "GetActiveWindow",
SetLastError = true, CharSet = CharSet.Auto)]
public static extern int GetActiveWindow();
[DllImport("user32.dll", EntryPoint = "GetWindowText",
SetLastError = true, CharSet = CharSet.Auto)]
public static extern int GetWindowText(int t, string str, int length);
public void Execute()
{
for (int i = 0; i < 10000; i++)
{
string str="";
GetWindowText(GetActiveWindow(), str, 10);
Console.WriteLine(str);
Thread.Sleep(1000);
}
Console.WriteLine("End");
}
}
class Program
{
static void Main()
{
ThreadClass t = new ThreadClass();
Thread p = new Thread(new ThreadStart(t.Execute));
p.Start();
Console.ReadLine();
p.Abort(); p.Join(1000);
}
}
}
в твоем случае лучше не использовать GetActiveWindow, т.к. данная функция, вроде бы, возвращает дескриптор активного окна процесса вызвавшего эту функцию, а у тебя консоль, поэтому 0(могу сильно ошибаться). попробуй лучше использовать GetForegroundWindow. вообще тебе обязательно надо на C# или можно на чем-то еще?
Спасибо большое! Да, вы правы. Действительно, GetActiveWindow возвращает дескриптор активного окна процесса, вызвавшего эту функцию. А GetForegroundWindow - это как раз то, что мне надо. Вообще, можно и на другом языке, но я просто его знаю лучше других, да и преподавателю не придется объяснять, почему я программирую на языке, отличном от того, который он нам преподает.
С позволения модераторов тему хотелось бы оставить открытой, так как в скором времени в процессе разработки непременно возникнут новые вопросы. Заранее благодарю.
А вот и новый вопрос. Как добраться до очереди событий окна? Если я не ошибаюсь, нужно использовать функции GetMessage и TranslateMessage. Хотелось бы увидеть пример. Пишу на C#, но разберусь и с C++. Заранее признателен.
зачем тебе тогда для этого добираться до очереди событий чужого окна?
Цитата: kosfiz
зачем тебе тогда для этого добираться до очереди событий чужого окна?
На самом деле мне надо найти все окна, не только активное окно, (что-то вроде Microsoft Spy++, который входит в Visual Studio.) И помимо этого добраться до очереди событий каждого окна. Т.е. при выборе окна из списка видеть его события. А GetForegroundWindow я использовал просто для того, чтобы попробовать добраться до очереди хотя бы активного окна.
так, вот тебе пример поиска всех окон(вроде работает), но без дочерних, т.е. только главные окна(кнопки, эдиты и т.д. как Spy++ не ищет):
kosfiz, спасибо большое за помощь. Пока не проверял (возможности не было), но все равно спасибо. Будут вопросы по коду, оставлю пост.