Вопрос № 63972: Уважаемые Эксперты!
Благодарю Вас за ранее оказанную мне помощь - я сумел использовать её весьма конструктивно.
Но у меня снова возник вопрос, который я никак в MSDN не могу нарыть.
У меня VS 2005, MFC.
У меня есть несколько прил...Вопрос № 63978: Добрый день.
Что то туплю, помогите.
VS2005....Вопрос № 64045: Уважаемые экспреты!
Возникла проблема, мне нужно сохранить в массив bmp файл, делаю так:
.. WinMain(...)
{
FILE *str;
BITMAPFILEHEADER hdr;
BITMAPINFOHEADER hdri;
byte *bitm;
str=fopen("a.bmp","r&q...
Вопрос № 63.972
Уважаемые Эксперты!
Благодарю Вас за ранее оказанную мне помощь - я сумел использовать её весьма конструктивно.
Но у меня снова возник вопрос, который я никак в MSDN не могу нарыть.
У меня VS 2005, MFC.
У меня есть несколько приложений, которые несколько приложений, которые при наступлении определённых условий должны вытаскиваться наверх на экране и становиться активными. Для каждой прилады свой пул условий. Я предположил следующую схему:
Эти приложения прописываются в данных моего самопального приложения и запускаются все при его запуске (я использовал для этого ShellExecute). Вроде логично и удобно. Всё нормально запускается, условия тоже успешно вычисляются.
Но вот на активизации я споткнулся! Похоже, надо получить для вновь открытого приложения что-то типа CWnd или HWND. Но как к этому подступиться - никак не могу понять. Пробовал для CWnd GetActiveWindow, но получаю во всех вариантах CWnd моего самопала. К HWND вообще не нашёл для MFC подходов.
Помогите, пожалуйста! Вероятно, я зациклился в каком-то тупике.
Отвечает: Tek
Здравствуйте, Васильев Н.Ю.!
Конкретно в вашем случае поможет поиск дескриптора окна (HWND) по наименованию:
Смотрите EnumWindows и EnumWindowsProc
А вообще то было бы лучше запускать приложения не ShellExecute, а с помощью CreateProcess, тогда вы сразу сможете получить дескриптор окна и сохранить его например в массиве в своей программе
--------- WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано (C)Почти Уинстон Черчилль :)
Ответ отправил: Tek (статус: 2-ой класс)
Ответ отправлен: 24.11.2006, 09:37 Оценка за ответ: 5 Комментарий оценки: Огромное Спасибо, Tek! Действительно - это выход из тупика! Больше недели искал нечто подобное, но как-то с поиском мне обычно средненько везёт. Выочень меня выручили!
Отвечает: Jadd
Здравствуйте, Васильев Н.Ю.!
Нет, тут все проще намного. Для поиска нужного окна используем FindWindow:
HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName);
Например,
HWND hWnd = FindWindow(NULL, "My Super Window");
Тут мы первый параметр опускаем, т.к. можем и не знать какое название класса окна использовалось при вызове RegisterClass или RegisterClassEx. Во втором указываем название окна.
А далее вызываем SetForegroundWindow:
BOOL SetForegroundWindow(HWND hWnd);
И наслаждаемся жизнью. Остальные подробности в MSDN.
Успехов.
--------- Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Профессионал) Адрес: Санкт-Петербург WWW:http://www.sport-diary.ru ICQ: 28260749 ---- Ответ отправлен: 24.11.2006, 09:42
Отвечает: Sergey A. Wedensky
Здравствуйте, Васильев Н.Ю.!
Добавлю, если Вы не знаете точно заголовок окна, или он может меняться, поиск придется вести по декскриптору процесса.
Можно, например, зпускать приолжение при помощи ShellExecuteEx, чтобы получить его, потом при наступлении нужного события перебирать окна и искать созданное нужным процессом. Пример в приложении.
Удачи!
Приложение:
Ответ отправил: Sergey A. Wedensky (статус: 8-ой класс)
Ответ отправлен: 24.11.2006, 09:56
Вопрос № 63.978
Добрый день.
Что то туплю, помогите.
VS2005.
Приложение:
Отправлен: 24.11.2006, 10:29
Вопрос задал: Kos (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Терсков Сергей
Здравствуйте, Kos!
Здесь ты выделяшь память под строку char *exp = new char[cb-ob-1];
Выделяешь ровно на три символа, но где четвертый?? Для символа конца строки 'Ведь без него функция strlen() и не будет работать корректно, т.к. длину строки она закачивает считать когда встречает это символ. Попробуй сделать примерно так.
char *exp = new char[cb-ob-1];
exp[cb-ob-1] = '
Должно работать...
Ответ отправил: Терсков Сергей (статус: 1-ый класс)
Ответ отправлен: 24.11.2006, 10:44 Оценка за ответ: 5 Комментарий оценки: Спасибо, точно! получилось.
Вопрос № 64.045
Уважаемые экспреты!
Возникла проблема, мне нужно сохранить в массив bmp файл, делаю так:
... WinMain(...)
{
FILE *str;
BITMAPFILEHEADER hdr;
BITMAPINFOHEADER hdri;
byte *bitm;
str=fopen("a.bmp","r");
fread(&hdr,sizeof(hdr),1,str);
fread(&hdri,sizeof(hdri),1,str);
bitm = new byte[hdri.biSizeImage];
fread(&bitm,hdri.biSizeImage,1,str);
fclose(str);
...
}
Заголовки читаются, всё работает... А при чтении bitm - программа зависает (100*100 уже не берет!)... Я понимаю что массив большой, но как тогда?
Отвечает: John Paramol
Здравствуйте, Golden Spider!
Думаю, проблема в следующем:
fread(&bitm,hdri.biSizeImage,1,str);
Нужно
fread(bitm,hdri.biSizeImage,1,str);
Удачи!
--------- 1=2, at values 1 large enough
Ответ отправил: John Paramol (статус: 4-ый класс)
Ответ отправлен: 24.11.2006, 20:13 Оценка за ответ: 5 Комментарий оценки: Спасибо.