Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Монитор окон

23K
20 апреля 2007 года
wildlucas
10 / / 20.04.2007
Здравствуйте! У меня такая проблема: для куросвой работы надо написать монитор окон. Т.е. программу, которая отслеживала бы открытые окна. У меня нет опыта программирования с использованием API-функций. Поэтому для начала я написал программу, отслеживающую активные окна. Возможно, я неправильно использую функцию GetActiveWindow, потому что она возвращает null. Не могу найти ошибку. Я был бы очень признателен помощи. Заранее благодарю.
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);
}

}
}
257
23 апреля 2007 года
kosfiz
1.6K / / 18.09.2005
в твоем случае лучше не использовать GetActiveWindow, т.к. данная функция, вроде бы, возвращает дескриптор активного окна процесса вызвавшего эту функцию, а у тебя консоль, поэтому 0(могу сильно ошибаться). попробуй лучше использовать GetForegroundWindow. вообще тебе обязательно надо на C# или можно на чем-то еще?
23K
24 апреля 2007 года
wildlucas
10 / / 20.04.2007
Спасибо большое! Да, вы правы. Действительно, GetActiveWindow возвращает дескриптор активного окна процесса, вызвавшего эту функцию. А GetForegroundWindow - это как раз то, что мне надо. Вообще, можно и на другом языке, но я просто его знаю лучше других, да и преподавателю не придется объяснять, почему я программирую на языке, отличном от того, который он нам преподает.
23K
24 апреля 2007 года
wildlucas
10 / / 20.04.2007
С позволения модераторов тему хотелось бы оставить открытой, так как в скором времени в процессе разработки непременно возникнут новые вопросы. Заранее благодарю.
23K
30 апреля 2007 года
wildlucas
10 / / 20.04.2007
А вот и новый вопрос. Как добраться до очереди событий окна? Если я не ошибаюсь, нужно использовать функции GetMessage и TranslateMessage. Хотелось бы увидеть пример. Пишу на C#, но разберусь и с C++. Заранее признателен.
257
30 апреля 2007 года
kosfiz
1.6K / / 18.09.2005
[quote=wildlucas]для куросвой работы надо написать монитор окон. Т.е. программу, которая отслеживала бы открытые окна.[/quote]
зачем тебе тогда для этого добираться до очереди событий чужого окна?
23K
30 апреля 2007 года
wildlucas
10 / / 20.04.2007
Цитата: kosfiz
зачем тебе тогда для этого добираться до очереди событий чужого окна?



На самом деле мне надо найти все окна, не только активное окно, (что-то вроде Microsoft Spy++, который входит в Visual Studio.) И помимо этого добраться до очереди событий каждого окна. Т.е. при выборе окна из списка видеть его события. А GetForegroundWindow я использовал просто для того, чтобы попробовать добраться до очереди хотя бы активного окна.

257
30 апреля 2007 года
kosfiz
1.6K / / 18.09.2005
так, вот тебе пример поиска всех окон(вроде работает), но без дочерних, т.е. только главные окна(кнопки, эдиты и т.д. как Spy++ не ищет):
Код:
#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;
}
23K
01 мая 2007 года
wildlucas
10 / / 20.04.2007
kosfiz, спасибо большое за помощь. Пока не проверял (возможности не было), но все равно спасибо. Будут вопросы по коду, оставлю пост.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог