Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
4-1117616006
Yandexman
2005-06-01 12:53
2005.08.14
Как изменить фоновую картинку на рабочем столе.


10-1099556750
sands
2004-11-04 11:25
2005.08.14
Callbacks &amp; CORBA


14-1121925748
Ega23
2005-07-21 10:02
2005.08.14
С днем рождения! 21 июля


1-1122551928
vigo
2005-07-28 15:58
2005.08.14
Вопрос по TOpenDialog


4-1118690640
S.T.O.R.M.
2005-06-13 23:24
2005.08.14
Com-port





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский