function FindLastWindow(const sClassName : string) : HWND;
var buff : array[0..255] of char;
begin
result := GetWindow(GetDesktopWindow, GW_CHILD);
result := GetWindow(result, GW_HWNDLAST);
repeat
GetClassName(result, buff, 256);//Получаем класс окна
if buff = sClassName then exit;
result := GetWindow(result, GW_HWNDPREV);
until result = 0;
end;
Изменение положения окна программы
Суть в следующем, с помощью некой функции изменить координаты окна запущенной программы, либо запустить программу с помощию некой функции, чтоб окно отобразилось в конкретном месте экрана. Сейчас использую ShellExecute, но она не позиционирует окна, в связи с чем, два запушенные окна программы, закрывают друг друга и проходится их растаскивать...:(
Если да, перед запуском найдите предыдущий(е) экземпляр(ы) окна через FindWindow() или EnumWindows(), а там либо просто поменять размер, либо сообщения посылать, вобщем вариантов много.
Хотя возможно есть и более изящные варианты :rolleyes:
гдето на форуме обсуждался вопрос как найти окно приложения по ID процесса
А далее MoveWindow для установки размера и положения
можно через EnumThreadWindows() по полученному при CreateProcess() ThreadId
Примерчик бы... Мне говорили, что можно ее получить по заголовку окна?
Цитата: IvanJulai
как ее получить?
Лучше конечно через PID (Process ID) как рекомендовал max_dark
Цитата: IvanJulai
получить по заголовку
Лучше искать по классу окна Через EnumWindows или GetWindow хотя ими же можно и заголовок найти, но если, однако если у вас будет запущен например WinWord и ваша программа тоже запускает его, то первым в список попадет Уже запущенный ворд, отсюда вывод - ищем с конца =)
Код:
Казалось бы все, ондако не факт что сразу после запуска программы появится окно нужного нам класс =( поэтому нужно таки запускать через CreateProcess() и проверять - является ли это окно - окном нашего процесса через GetWindowThreadProcessID(), если нет, нужно немного подождать и еще раз вызвать FindLastWindow()... поедие правильно но в процессах я пока ноль, так что экспериментируйте.
- CreateProcess
- WaitForInputIdle
- EnumThreadWindows
- MoveWindow
The WaitForInputIdle function only works with GUI applications. If a console application calls the function, it returns immediately, with no wait.
DWORD WaitForInputIdle(
HANDLE hProcess, // handle to process
DWORD dwMilliseconds // time-out interval in milliseconds
);
Parameters:
hProcess
Identifies the process.
dwMilliseconds
Specifies the time-out interval, in milliseconds. If dwMilliseconds is INFINITE, the function does not return until the process is idle.[/QUOTE]
Цитата: max_dark
WaitForInputIdle
ого я думал такого нет?!
Нда, буду на ночь справочник читать