Форум: "WinAPI";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
Внизработа с окнами через WinApi в Windows 2000 Найти похожие ветки
← →
Greg123 (2005-05-26 15:00) [0]У меня есть программа, которая запускает другое приложение и программно нажимает в нём кнопки.
Эта прога отлично работает в Windows XP, но перестаёт работать в Windows 2000, т.е. например по активации окна функциями SetForegroundWindow или SetWindowPos вместо развёртывания окон они только мигают или запускается копия приложения.
Как это поправить???
Вот для примера кусок кода:
window_handle:=FindWindow(nil,pchar("exe Программа"));
if window_handle<>0 then
begin
SetForegroundWindow(window_handle);
button_handle:=FindWindowEx(window_handle,0,nil,pchar ("&Контроль"));
if(button_handle<>0) then
begin
SetForegroundWindow(button_handle);
keybd_event(VK_RETURN,0,0,0);
keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
//или так SendMessage(button_handle,bm_click,0,0);
i := 1;
end;
end;
Sleep(7000);
end;
← →
Digitman © (2005-05-26 15:29) [1]
> Sleep(7000);
это особо умиляет
← →
Greg123 (2005-05-26 15:42) [2]Может подскажешь как сделать по-умному
← →
Digitman © (2005-05-26 15:49) [3]
> Greg123 (26.05.05 15:42) [2]
может и подскажу.
но может подскажешь для начала, откуда в твоем коде взялся этот слип ?
← →
Greg123 (2005-05-26 16:05) [4]Этот кусок проверяет не появилось ли определённое окно,
чтобы не было тормозов, поставил проверку через 7 сек.
Кусок кода вырезал криво, вначале ещё есть do... while
← →
Digitman © (2005-05-26 16:07) [5]
> чтобы не было тормозов, поставил проверку через 7 сек
ГДЕ написано, что без оного кода ожидаются какие-то "тормоза" ?
← →
Greg123 (2005-05-26 16:16) [6]В программе, на которой нажимаются кнопки обсчитываются данные и бежит счётчик, при переключении между окном моей программы и этой расчёт замедляется (как мне показалось)
← →
alpet © (2005-05-26 17:12) [7]Тебе нужно AttachThreadInput использовать, что-бы окно реально "всплывало". А Sleep убери, для таких случаев функцию лучше вызывать по таймеру (WM_TIME).
← →
ANB © (2005-05-26 17:17) [8]
> SetForegroundWindow(button_handle);
- эта функция не умеет активировать КНОПКИ. Как у тебя на ХР работала - ума не приложу. И зачем ты кликаешь по кнопке клавиатурой, да еще и через keybd_event.
<offtop>
А чего вообще пишешь ?
</offtop>
← →
ANB © (2005-05-26 17:18) [9]
> Тебе нужно AttachThreadInput использовать
- млин, а у меня на ХР без нее окно поднимается. Это только для 2000 или я чего то не то сделал ?
← →
Greg123 (2005-05-26 17:20) [10]Если не трудно, можно поподробнее как в моём случае пользоваться функцией AttachThreadInput
← →
ANB © (2005-05-26 17:24) [11]SetForegroundWindow(window_handle);
Попробуй, напиши результат.
← →
Greg123 (2005-05-26 17:29) [12]У меня в первоначальном коде используется данная функция.
Результат:
При потере фокуса окно на панели задач начинает мигать и кнопка из-за этого не нажимается
← →
Greg123 (2005-05-26 17:31) [13]А в Windows XP всё нормально : окно разворачивается,
проблема в том, что мне надо и Windows 2000 и XP
← →
ANB © (2005-05-26 17:42) [14]Так оно у тебя свернуто что ли ? Я гонял свою прогу на 2000 - все работает. Если окно не сворачивал.
← →
ANB © (2005-05-26 17:43) [15]SetForegroundWindow(window_handle); У тебя, кажись, button.
← →
alpet © (2005-05-26 17:50) [16]1. Тебе надо получить id потока которому принадлежит окно (id_another_thread), проще всего через GetWindowThreadProcessId
2. Получить id текущего потока (id_current_thread)
3. Вызвать AttachThreadInput (id_current_thread, id_another_thread, true)
4. Вызвать SetForegroundWindow (window_handle);
5. Вызвать AttachThreadInput (id_current_thread, id_another_thread, false), для отключения (detach) механизма обработки ввода.
← →
Greg123 (2005-05-26 17:52) [17]Окно у меня не свёрнуто а просто не активно (закрыто другим окном)
window_handle - дескриптор окна, на котором кнопка
button_handle - дескриптор самой кнопки
Суть моей проблемы:
Если не трогать приложение, то всё нормально, все кнопки нажимаются, но если во время работы программы переключаться между окнами. то теряется фокус и я не могу программно нажать кнопку на окне.
← →
alpet © (2005-05-26 17:54) [18]Если не трогать приложение, то всё нормально, все кнопки нажимаются, но если во время работы программы переключаться между окнами. то теряется фокус и я не могу программно нажать кнопку на окне.
Если использовать не keybd_event, а PostMessage то сможешь, а это гораздо лучше (окно не будет всплывать в неожиданных ситуациях).
← →
Greg123 (2005-05-26 17:58) [19]Я пробовал:
SendMessage(button_handle,bm_click,0,0);
но если окно не активно, то результат тот же
или нужно как то по другому примения эту функцию SendMessage(PostMessage)
← →
alpet © (2005-05-26 18:08) [20]bm_click это симуляторное сообщение :).
Лучше отправь сообщение самому окну, типа такого:
PostMessage (WM_COMMAND, BN_CLICKED shl 16, button_handle);
← →
Greg123 (2005-05-26 18:15) [21]Пишет:
Not enough actual parameters
Я только начал изучать Delphi
Так что даже не знаю где здесь ошибка
???PostMessage (WM_COMMAND, BN_CLICKED shl 16, button_handle);???
Напиши пожалуйста правильно
← →
alpet © (2005-05-26 18:52) [22]Забыл, добавь первый параметр window_handle, или что-там у тебя это окно идентифицирует.
PostMessage (window_handle, WM_COMMAND, BN_CLICKED shl 16, button_handle);???
← →
vertal © (2005-05-26 20:12) [23]Так в 2000 работает:
procedure ReliableSetForegroundWindow(const HWND: HWND);
var
hThreadToAttach: DWORD;
begin
hThreadToAttach := GetWindowThreadProcessId(HWND, nil);
AttachThreadInput(GetCurrentThreadId, hThreadToAttach, TRUE);
if IsIconic(HWND) then ShowWindow(HWND, SW_RESTORE);
BringWindowToTop(HWND);
SetForegroundWindow(HWND);
AttachThreadInput(GetCurrentThreadId, hThreadToAttach, FALSE);
SendMessage(GetDesktopWindow(), WM_SYSCOMMAND, WPARAM(SC_HOTKEY), LPARAM(HWND));//fatality
end;
← →
Greg123 (2005-05-26 21:16) [24]Спасибо за ответы!!!
← →
Greg123 (2005-05-27 09:08) [25]ReliableSetForegroundWindow попробовал эту процедуру, но при смене фокуса нужное окно не выходит на передний план
Так же попробовал по старому SetForegroundWindow(window_handle) вместе с функцией PostMessage (window_handle, WM_COMMAND, BN_CLICKED shl 16, button_handle) - ничего не происходит
Если я правильно понял по этому сообщению должна нажаться кнопка даже если окно в данный момент не активно?
← →
alpet © (2005-05-27 10:53) [26]Greg123 (27.05.05 09:08) [25]
Кнопка конечно нажаться не должна, но окно должно обработать ее нажатие :), если это конечно кнопка. В отладчике у тебя window_handle точно не нулевое ?
← →
Greg123 (2005-05-27 11:03) [27]Да я проверял дискрипторы и у окна и у кнопки находятся
button_handle - кнопка
window_handle - окно
Если можно расшифруй эту команду(3 и 4 параметры)
Может ещё дело в том, что дискриптор кнопки имеет & (кнопка имеет комбинацию горячих клавиш)???
Может у тебя есть какой-нибудь пример работы данной команды?
← →
alpet © (2005-05-27 11:33) [28]Стоит тогда проверить какие сообщения принимает окно window_handle, при нажатии кнопки мышью (с помощью Wingsight32 / Spy++). По идее сообщение WM_COMMAND используется в большинстве случаев для обработки событий от контролов и элементов меню.
← →
Greg123 (2005-05-27 12:36) [29]Может дел в том, что класс кнопки TRzButton?
← →
alpet © (2005-05-27 14:50) [30]Очень даже может быть. Другое дело тебе надо все же посмотреть какие сообщения получает эта кнопка и само окно когда ее мышью нажимаешь.
← →
Hrom005 (2005-06-13 03:37) [31]Всем привет! Будьте человеками, скиньте прогу - позарез надо
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.013 c