Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi и WinAPI

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
esaul123
0 / 0 / 0
Регистрация: 05.07.2011
Сообщений: 4
#1

обьясните что к чему winapi - Delphi WinAPI

06.08.2011, 20:34. Просмотров 1323. Ответов 12
Метки нет (Все метки)

исходник найден в интернете. почему окно становится активным, только если программа выполняющая этот код сама активна. если все это поместить в таймер, то пока программа активна, то всё норм, а если я делаю активным другое окно, то ничего не происходит.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ListBox1.Clear;
Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO BEGIN {Не показываем:}
  IF (Wnd <> Application.Handle) AND {-Собственное окно}
  IsWindowVisible(Wnd) AND {-Невидимые окна}
  (GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна}
  (GetWindowText(Wnd, buff, sizeof(buff)) <> 0)
  THEN BEGIN
  GetWindowText(Wnd, buff, sizeof(buff));
  ListBox1.Items.Add(StrPas(buff));
  END;
  Wnd := GetWindow(Wnd, gw_hWndNext);
END;
ListBox1.ItemIndex := 0;
 
for i:=0 to ListBox1.Count-1 do
//if Pos('Калькулятор',ListBox1.Items[i])<>0 then begin
if Pos('Калькулятор',ListBox1.Items[i])<>0 then begin
h:=FindWindow(0,PAnsiChar(ListBox1.Items[i]));
 
BringWindowToTop(h);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.08.2011, 20:34
Я подобрал для вас темы с готовыми решениями и ответами на вопрос обьясните что к чему winapi (Delphi WinAPI):

Как увидеть то, что вернула функция WinApi? - Delphi WinAPI
например вот такая процедура procedure TForm1.btnSysDirClick(Sender: TObject); var sysdir:PAnsiChar; s:Cardinal; res:Integer; ...

Обьясните - Delphi
Народ вот браузер, может кто обьяснить как там организована история?

Вычесление простейшего выражения. народ если несложно обьясните что я зделал здесь неправильно и наглядным образом чтобы я понял как что делать. - Assembler
Нужно вычислить выражения 2*17/7-1708/17*1992. Пожалуйста, зарание благодарен. .386 . model flat .data _a dd 34 _b dd 7 _c...

Нужно описание исходного кода скринсейвера, т.е. где что происходит, что чему и для чего присваивается и т.д - Delphi
unit unitMain; interface uses Windows, Classes, Graphics, Forms, Registry; type TfrmMain = class(TForm) procedure...

Объясните подробно данный код программы. Знаю что это фильтр а пошагово что к чему не понимаю - C++ Builder
void __fastcall TForm1::suiButton7Click(TObject *Sender) { tdiag -&gt; Filtered = false; tdiag -&gt; Filt = «id_p=« + suiEdit6 -&gt; Text; ...

Обьясните что в данной строке - C#
Понимаю что строка вырвана из контекста, но что значит индекс х? AB1.MapIndexedInplace((i, j, x) =&gt; aParcel + bParcel - 2 * x);

12
anonimus
2154 / 1244 / 32
Регистрация: 28.04.2010
Сообщений: 4,563
06.08.2011, 21:03 #2
если тебе надо найти окно в заголовке которого есть "Калькулятор" и сделать его по верх остальных, то можно проще, зачем так усложнять
0
esaul123
0 / 0 / 0
Регистрация: 05.07.2011
Сообщений: 4
06.08.2011, 21:30  [ТС] #3
это да, можно без listbox и всё короче сделать, я пробывал по другому, но проблема та же.
0
anonimus
2154 / 1244 / 32
Регистрация: 28.04.2010
Сообщений: 4,563
06.08.2011, 22:19 #4
хм... да странно, но тут проблема с функцией BringWindowToTop почему-то не переходит найденое окно поверх остальных, кстате SetForegroundWindow тоже
0
DenNik
Непрофессионал
1783 / 1263 / 207
Регистрация: 26.07.2011
Сообщений: 7,474
08.08.2011, 16:12 #5
Вот. Работает. Фишка в том, что заголовок окна нужно полностью писать.

Delphi
1
2
3
4
5
6
7
8
procedure TForm1.Button2Click(Sender: TObject);
var
  h: HWND;
begin
  h:= FindWindow(nil,'Калькулятор');
  if h <> 0 then
    SetForegroundWindow(h) else ShowMessage('Calc Not Found!');
end;
работает даже если окно не активно. А если чужое окно свернуто на панель задач, поможет код

Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TForm1.Button2Click(Sender: TObject);
var
  h: HWND;
begin
  h:= FindWindow(nil,'Калькулятор');
  if h <> 0 then
  begin
    ShowWindow(h,SW_RESTORE);
    SetForegroundWindow(h);
  end else ShowMessage('Calc Not Found!');
end;
0
anonimus
2154 / 1244 / 32
Регистрация: 28.04.2010
Сообщений: 4,563
08.08.2011, 16:40 #6
Цитата Сообщение от DenNik Посмотреть сообщение
Фишка в том, что заголовок окна нужно полностью писать.
я так же пробовал, не становилось окно активно если окно моей программы не активно, начинала мигать на панели задач, но поверх остальных не переходило, пробовал на висте.
0
DenNik
Непрофессионал
1783 / 1263 / 207
Регистрация: 26.07.2011
Сообщений: 7,474
08.08.2011, 16:43 #7
Цитата Сообщение от anonimus Посмотреть сообщение
я так же пробовал, не становилось окно активно если окно моей программы не активно, начинала мигать на панели задач, но поверх остальных не переходило, пробовал на висте.
я работаю на хрюшке. насчет висты не знаю. а по поводу мигания смотри мой второй код
0
anonimus
2154 / 1244 / 32
Регистрация: 28.04.2010
Сообщений: 4,563
08.08.2011, 17:01 #8
))) и так я делал
посылал SW_RESTORE окну. Работало если окно до этого было свернуто, но если окно перекрывало другое окно и скрыто окно моей формы, то не работало
0
DenNik
Непрофессионал
1783 / 1263 / 207
Регистрация: 26.07.2011
Сообщений: 7,474
08.08.2011, 17:13 #9
вот, попробуй в таймере. запусти программу, сверни ее и погляди что получится. Интервал я выставил 5000.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.Timer1Timer(Sender: TObject);
var
  h: HWND;
begin
  h:= FindWindow(nil,'Калькулятор Плюс');
  if h <> 0 then
  begin
    ShowWindow(h,SW_RESTORE);
    SetForegroundWindow(h);
  end else ShowMessage('Calc Not Found!');
  Timer1.Enabled:= false;
end;
я делал так. запускаю калькулятор, запускаю свою прогу, перекрываю калькулятор другим окном, жду. Работает
0
Mawrat
12820 / 5728 / 676
Регистрация: 19.09.2009
Сообщений: 8,807
08.08.2011, 17:28 #10
anonimus, верно говорит - при тех условиях окно не выдвинется вперёд. Я в своё время искал сведения в инете, как переместить окно на передний план, если оно перекрыто окнами других приложений. Оказалось, что это непростая задача. По крайней мере, в WinXP и более старших версиях принято правило, что только пользователь должен решать, какое приложение должно показать своё окно впереди.
0
anonimus
2154 / 1244 / 32
Регистрация: 28.04.2010
Сообщений: 4,563
08.08.2011, 17:39 #11
Цитата Сообщение от DenNik Посмотреть сообщение
Работает
может вся соль в ShowWindow(h,SW_RESTORE);
я пробовал посылать сообщение окну через sendmessage, ShowWindow не пробовал.
0
Mawrat
12820 / 5728 / 676
Регистрация: 19.09.2009
Сообщений: 8,807
08.08.2011, 17:42 #12
Не работает. anonimus, ты верно пишешь, что если окно перекрыто окнами других приложений, то на передний план тот код его не переместит. Я об этом уже в предыдущем посте упомянул.
0
anonimus
2154 / 1244 / 32
Регистрация: 28.04.2010
Сообщений: 4,563
08.08.2011, 17:45 #13
Цитата Сообщение от Mawrat Посмотреть сообщение
Не работает.
ок. А то счас не могу проверить
0
08.08.2011, 17:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2011, 17:45
Привет! Вот еще темы с ответами:

Прокоментируйте, обьясните что это - C++
Листинг 11.3. Вызов конструктора и деструктора 1: //Листинг 11.3. Вызов конструктора и деструктора. 2: 3: #include &lt;iostream.h&gt; 4:...

Обьясните что делает программа - C++
Обьясните что делает программа детально, описав все её действия. Программа находит наименьший положительный елемент. вот код: const...

Обьясните, что возвращает функция - Pascal ABC
Function min(d,b:integer); begin if d&gt;=b then min:=b else min:=d; end;

Что это? Обьясните пожалуста! - C++
Собствено, я не знаю, как это назвать. О чем это мне собщает визуал студия? Пожалуста, обьясните если мжно!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru