Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.14;
Скачать: CL | DM;

Вниз

работа с окнами через 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 вся ветка

Текущий архив: 2005.08.14;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.037 c
1-1122171157
GuestPascal
2005-07-24 06:12
2005.08.14
последовательность визуализации окна


1-1122372361
serjufa
2005-07-26 14:06
2005.08.14
ак программно из D5 заставить на листе Excel отобразиться сетке


14-1121764709
reticon
2005-07-19 13:18
2005.08.14
Загрузка процессора и svchost.exe


14-1120455924
Ega23
2005-07-04 09:45
2005.08.14
С днем рождения! 4 июля


1-1122448853
kyn66
2005-07-27 11:20
2005.08.14
Программирование штрихкода