powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как проверить существование окна по заголовку
21 сообщений из 21, страница 1 из 1
Как проверить существование окна по заголовку
    #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
Как проверить существование окна по заголовку
    #38535056
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
trom,

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

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



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

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

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

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

это и так понятно, я рабочий пример хочу увидеть
...
Рейтинг: 0 / 0
Как проверить существование окна по заголовку
    #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
Как проверить существование окна по заголовку
    #38535116
trom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий77,

Ясности вообще не добавилось к сожалению
...
Рейтинг: 0 / 0
Как проверить существование окна по заголовку
    #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
Как проверить существование окна по заголовку
    #38535454
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tromMasterZiv,

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

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

и всё в цикле.

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

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

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


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

BOOL CALLBACK EnumWindowsProc

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

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


в этой функции внутри будет цикл, в котором ...
Ну, я то это понимаю, что внутри.
Просто человек с таким вводом сейчас начнет писать СВОЙ цикл /мучительно думать как это сделать.
...
Рейтинг: 0 / 0
Как проверить существование окна по заголовку
    #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
Как проверить существование окна по заголовку
    #38536851
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
trom,

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

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


len- вернет реальную длину полученной строки (до нулевого '\0' символа), соотв. тебе надо взять левую часть длиной len от твоего buff (плюс нулевой char -если он нужен).
По C++ синтаксису строк пусть тебе местные спецы подсказывают, меня эта многообразная кухня бесит.
...
Рейтинг: 0 / 0
Как проверить существование окна по заголовку
    #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
Как проверить существование окна по заголовку
    #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
Как проверить существование окна по заголовку
    #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
21 сообщений из 21, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как проверить существование окна по заголовку
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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