Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как проверить существование окна по заголовку / 21 сообщений из 21, страница 1 из 1
23.01.2014, 00:16
    #38535042
trom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить существование окна по заголовку
к примеру поиск окна блокнота

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
char applicationName[] = "Блокнот";
HWND WindowsHandle = FindWindow(0, (LPCWSTR)applicationName);
 
_cprintf("WindowsHandle= %d\n", WindowsHandle);


stringstream sst;
sst << WindowsHandle;
string hConsole_str= sst.str();sst.str("");

_cprintf("hConsole_str %s ", hConsole_str.c_str());



у меня постоянно выводит 0 и 000000 во втором случае
Как сделать так чтобы заработало, в инете не могу найти рабочий пример.
...
Рейтинг: 0 / 0
23.01.2014, 00:31
    #38535056
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить существование окна по заголовку
trom,

Вы передаете неюникодную строку в функцию принимающую юникодную, и при этом еще и принудительное приведение типа делаете (где вы такой ерунде научились?)
Передавайте то что описано в доке по функции, а не выдумывайте.
Например так:
Код: plaintext
1.
2.
TCHAR applicationName[] = TEXT("Блокнот");
HWND WindowsHandle = FindWindow(0, applicationName);
...
Рейтинг: 0 / 0
23.01.2014, 00:34
    #38535059
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить существование окна по заголовку
tromу меня постоянно выводит 0 и 000000 во втором случае
Что неудивительно, поскольку ты пихаешь char туда, где нужен wide char.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.01.2014, 00:45
    #38535065
trom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить существование окна по заголовку
Anatoly Moskovsky,

Код: plaintext
1.
2.
TCHAR applicationName[] = TEXT("Блокнот");
HWND WindowsHandle = FindWindow(0, applicationName);



Работает только когда пишу полностью все имя окна
А к примеру "Блокнот" это часть имени окна и поиск опять возвращает 0
Как найти окно по неполному имени ?
...
Рейтинг: 0 / 0
23.01.2014, 00:52
    #38535068
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить существование окна по заголовку
trom,

Откуда мне знать, я вам ответил почему ваш код не работал.
А как искать окна - я вообще не в курсе :)
...
Рейтинг: 0 / 0
23.01.2014, 00:59
    #38535069
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить существование окна по заголовку
tromКак найти окно по неполному имени ?
EnumWindows() и сравнивай заголовки как в голову взбредёт.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.01.2014, 01:11
    #38535072
trom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить существование окна по заголовку
Dimitry Sibiryakov,

А можно пример кода как найти окно по части его заголовка с помощью EnumWindows().
В примерах из инета такая каша.
...
Рейтинг: 0 / 0
23.01.2014, 01:50
    #38535080
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить существование окна по заголовку
trom,

да никак, все окна обходить, получать заголовок, и смотреть, что он начинается на нужное слово.
...
Рейтинг: 0 / 0
23.01.2014, 02:34
    #38535087
trom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить существование окна по заголовку
MasterZiv,

это и так понятно, я рабочий пример хочу увидеть
...
Рейтинг: 0 / 0
23.01.2014, 02:52
    #38535093
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить существование окна по заголовку
tromА можно пример кода как найти окно по части его заголовка с помощью EnumWindows().
Лови. Рабочий.
Как ТОЧНО и БЕЗОШИБОЧНО узнать hwndTarget целевого окна?
Ну, на C++ я думаю перепилишь.
Но обрати внимание еще на это .
Дмитрий77Как вариант...

Добавить в целевое окно кнопку, сделать ей:

Код: vbnet
1.
2.
Button.Caption = "This is the GUID qwertyuiop" 'такую фигню случайно не придумаешь
.Visible=false



И искать перебором типа

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
    If Title = "Form1" Then
      Dim hwndTemp As Long
      hwndTemp = FindWindowEx(app_hwnd, 0&, vbNullString, "This is the GUID qwertyuiop")
      If hwndTemp <> 0 Then 'если есть child с зарезервированной фигней в его Caption
        hwndEnumTarget = app_hwnd
        EnumWindowsProc = False ' Save the hwnd and end the enumeration
        Exit Function
      End If
    End If



Т.е. (если окно/прога что ты ищешь суть твоя) пихаешь в форму холостой невидимый контрол (child), но с уникальным текстом в заголовке и делаешь перепроверку по этому имени. Без этого у меня иногда "находил не то".

Ну и с юникодом/не юникодом конечно аккуратней, ты уж определись используешь ли ты Юникод в своей проге или нет.
...
Рейтинг: 0 / 0
23.01.2014, 06:01
    #38535116
trom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить существование окна по заголовку
Дмитрий77,

Ясности вообще не добавилось к сожалению
...
Рейтинг: 0 / 0
23.01.2014, 09:33
    #38535181
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить существование окна по заголовку
trom,

Ты просил пример, я тебе дал алгоритм.

1) Вызываешь
Код: plaintext
1.
2.
 EnumWindows(EnumWindowsProc, NULL); //ждет пока ТЫ не вернешь FALSE из EnumWindowsProc, или пока окна не закончатся
 cout << hWndTarget<< '\n';

2) Пишешь ф-цию
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {
кот. будет вызвана для КАЖДОГО окна
3) Оцениваешь внутри EnumWindowsProc каждое окно
через GetWindowText(hWnd)
если это окно удовлетворяет твоим критериям,
то возвращаешь False из EnumWindowsProc, при этом тек. значение hWnd сохраняешь в глобальной hWndTarget

hWndTarget будет содержать нужное hwnd
...
Рейтинг: 0 / 0
23.01.2014, 12:40
    #38535454
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить существование окна по заголовку
tromMasterZiv,

это и так понятно, я рабочий пример хочу увидеть

Э... а что там интересного-то ? Простой код на С/С++.
Получил заголовок окна. GetWindowText.
Проверил. strstr или strtok или скажем boost::regexp.

и всё в цикле.

Если ты сам не в состоянии такое написать, то как-то странно, что ты вообще "взялся за клавиатуру".
...
Рейтинг: 0 / 0
23.01.2014, 17:37
    #38535871
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить существование окна по заголовку
MasterZivи всё в цикле.А цикл то там где? С BOOL CALLBACK EnumWindowsProc ?
...
Рейтинг: 0 / 0
23.01.2014, 18:00
    #38535905
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить существование окна по заголовку
Дмитрий77,

Эта функция будет вызываться в цикле, которого НЕ будет в твоей программе.

Код: plaintext
1.
2.
3.
BOOL WINAPI EnumWindows(
  _In_  WNDENUMPROC lpEnumFunc,
  _In_  LPARAM lParam
);


в этой функции внутри будет цикл, в котором она будет вызывать твою

BOOL CALLBACK EnumWindowsProc

пока последняя не вернёт FALSE.
...
Рейтинг: 0 / 0
23.01.2014, 18:54
    #38535972
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить существование окна по заголовку
MasterZivв цикле, которого НЕ будет в твоей программе .

Код: plaintext
1.
2.
3.
BOOL WINAPI EnumWindows(
  _In_  WNDENUMPROC lpEnumFunc,
  _In_  LPARAM lParam
);


в этой функции внутри будет цикл, в котором ...
Ну, я то это понимаю, что внутри.
Просто человек с таким вводом сейчас начнет писать СВОЙ цикл /мучительно думать как это сделать.
...
Рейтинг: 0 / 0
24.01.2014, 12:50
    #38536716
trom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить существование окна по заголовку
Дмитрий77,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {
	LPWSTR buff;
	GetWindowText(hWnd,buff, 100);
	//_cprintf("hConsole_str %c ", buff);

	return true;
}

EnumWindows(EnumWindowsProc, NULL);



сделал так, в итоге прога вылетает с ошибкой что
buff is being used without being initialized

что не так делаю?
...
Рейтинг: 0 / 0
24.01.2014, 13:50
    #38536851
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить существование окна по заголовку
trom,

Ну наверно как-то так тебе надо:

Код: plaintext
1.
2.
char buff [100];
int len = GetWindowText(hWnd, buff, 100);


len- вернет реальную длину полученной строки (до нулевого '\0' символа), соотв. тебе надо взять левую часть длиной len от твоего buff (плюс нулевой char -если он нужен).
По C++ синтаксису строк пусть тебе местные спецы подсказывают, меня эта многообразная кухня бесит.
...
Рейтинг: 0 / 0
24.01.2014, 13:52
    #38536859
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить существование окна по заголовку
trom
Код: plaintext
1.
2.
	LPWSTR buff;
	GetWindowText(hWnd,buff, 100);



сделал так, в итоге прога вылетает с ошибкой что
buff is being used without being initialized

что не так делаю?

0) Используешь отладочную версию программы.

1) не инициализируешь переменные.

2) не выделяешь память под буфер

3) возможно, занимаешься не той профессией ...
...
Рейтинг: 0 / 0
24.01.2014, 14:21
    #38536917
trom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить существование окна по заголовку
Дмитрий77,

не len тут мне не поможет

Вот так запускается и работает но выводит какой то мусор, а не заголовки окон
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
BOOL CALLBACK EnumChildProc(HWND hWnd,LPARAM lParam)
{

	TCHAR buff[260];
	
	GetWindowText(hWnd, buff, 260);
	printf("title: %s\n", buff);

	return TRUE;    // continue enumeration
}

EnumWindows(EnumChildProc, NULL);
...
Рейтинг: 0 / 0
24.01.2014, 14:59
    #38536975
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить существование окна по заголовку
trom,

попробуй
напиши GetWindowText A (явно укажи на ANSI) вместо GetWindowText
и замени
TCHAR buff[260];
на
char buff[260];

У тебя в буфере изначально 260 символов мусора.
len как раз возвращает полезную длину:
GetWindowText function


Return value
Type: int
If the function succeeds, the return value is the length, in characters, of the copied string, not including the terminating null character. If the window has no title bar or text, if the title bar is empty, or if the window or control handle is invalid, the return value is zero.
Ну и читай нудную документацию по всяким там char, TCHAR, LPTSTR и функциям преобразования с ними.
В VB6 тебе бы было нужно
Код: vbnet
1.
Left(buff, len)


В C+/- конечно без листинга кода конечно не обойдешься.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как проверить существование окна по заголовку / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]