Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 20.11.2013, 00:07   #1
Angelochek*
Пользователь
 
Регистрация: 26.09.2013
Сообщений: 26
Вопрос Выбор с помощью ComboBox.

Есть процедура на получение списка заголовков окон и их хэндлов, сначало заносит в ComboBox заголовок окна потом дескриптор в масив хэндлов.

Код:
Var
hwndlm: array[0..127] of THandle;

procedure TForm1.ComboBox2DropDown(Sender: TObject);

var
  buff: array[0..127] of Char;
  i: integer;

begin
ComboBox2.Clear;
 i:=0;
     hwndlm[i] := GetWindow(Handle, gw_HWndFirst);
  while hwndlm[i] <> 0 do begin {Не показываем:}
    if (hwndlm[i] <> Application.Handle) and {-Собственное окно}
      IsWindowVisible(hwndlm[i]) and {-Невидимые окна}
      (GetWindow(hwndlm[i], gw_Owner) = 0) and {-Дочернии окна}
      (GetWindowText(hwndlm[i], buff, sizeof(buff)) <> 0) {-Окна без заголовков}
      then begin
      GetWindowText(hwndlm[i], buff, sizeof(buff));
      ComboBox2.Items.Add(StrPas(buff));
    end;
    i:=i+1;
      hwndlm[i] := GetWindow(hwndlm[i-1], gw_hWndNext);
    end;
  ComboBox2.ItemIndex := 0

end;
Потом мне нужно получить хэндл из масива номер которого соответствует номеру выбранного заголовка в ComboBox делаю так

Код:
Var
hwmd2: THandle;
 Begin
hwnd2:=hwndlm[ComboBox2.ItemIndex];
И дальше работаю с hwnd2 и не получается например не активирует окно
Код:
SetForegroundWindow(hwnd2);
Активация с окном которым я работаю работает если нахожу хэндл с помощью
Код:
hwnd2:=FindWindow(nil, PChar(ComboBox2.Text));
Если вы спросите почему я так не делаю дело в том что может быть запущено несколько таких окон с одинаковыми заголовками. Что не так делаю?
Angelochek* вне форума
Старый 20.11.2013, 00:12   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Что не так делаю?
Для начала ты не обрабатываешь результат SetForegroundWindow. Если она возвращает ошибку, на нее нужно отреагировать
Получи для начала результат этой функции, и если он не 0 с помошью GetLastError() выясни код ошибки. Остальное потом.
I'm learning to live...
Stilet вне форума
Старый 20.11.2013, 17:36   #3
Angelochek*
Пользователь
 
Регистрация: 26.09.2013
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Получи для начала результат этой функции
Как это сделать? Через Google не нашел а я Яндекс вообще выдает результаты ЕГЭ.
Цитата:
Сообщение от Stilet Посмотреть сообщение
, и если он не 0 с помошью GetLastError() выясни код ошибки.
Пытаюсь вот так
Код:
if GetLastError() <> 0 then begin
    Label3.Caption:=PChar(GetLastError());
   end;
Caption метки не изменяется.

Я сравнил результаты выполнений функций FindWindow и GetWindow и они не равны и результат GetWindow не годится для SetForegroundWindow. Как эту проблему можно решить? Функция FindWindow извлекает дескриптор окна верхнего уровня. Как получить дескриптор окна верхнего уровня имея какой дает GetWindow?

Код:
var
  hwndlm: array[0..200] of THandle;
  ip: integer;
  ComboBoxl: array[0..200] of string;

procedure TForm1.ComboBox2DropDown(Sender: TObject);

var
   i: integer;

begin
ComboBox2.Clear;
 ip:=0;
  EnumWindows(@EnumWindowsProc, 0);
  for i:=0 to 200 do 
     ComboBox2.Items.Add(ComboBoxl[i]);

end;

function EnumWindowsProc(Wnd : hWnd; lp : LPARAM) : BOOL; stdcall;

var
  buff: array[0..127] of Char;

 Begin
    hwndlm[ip]:=Wnd;
    GetWindowText(Wnd, buff, sizeof(buff));
    ComboBoxl[ip]:=StrPas(buff);
    ip:=ip+1;

 End;
ComboBox2 получается пустым, в чем моя ошибка?

Последний раз редактировалось Stilet; 23.11.2013 в 21:44.
Angelochek* вне форума
Старый 23.11.2013, 21:45   #4
Angelochek*
Пользователь
 
Регистрация: 26.09.2013
Сообщений: 26
По умолчанию

Найдена ошибка в коде первого сообщения и что вы не подсказали? Молчуны
Angelochek* вне форума
Старый 23.11.2013, 21:54   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

No comments...
I'm learning to live...
Stilet вне форума
Старый 23.11.2013, 22:00   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
hwndlm: array[0..127] of THandle;
это не нужно
Цитата:
for i:=0 to 200 do
ComboBox2.Items.Add(ComboBoxl[i]);
а это для чего?
eval вне форума
Старый 23.11.2013, 22:09   #7
Angelochek*
Пользователь
 
Регистрация: 26.09.2013
Сообщений: 26
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
это не нужно
Это нужно я туда заношу список хэндлов.
Цитата:
Сообщение от eval Посмотреть сообщение
а это для чего?
Здесь я пытаюсь добавить в ComboBox найденный заголовок окна.
Angelochek* вне форума
Старый 23.11.2013, 22:20   #8
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
Это нужно я туда заношу список хэндлов.
комбобокс и сам умеет хранить, так это лишнее

Цитата:
Здесь я пытаюсь добавить в ComboBox найденный заголовок окна.
ну оно и так видно, а зачем оно надо?
eval вне форума
Старый 27.11.2013, 23:47   #9
Angelochek*
Пользователь
 
Регистрация: 26.09.2013
Сообщений: 26
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
комбобокс и сам умеет хранить, так это лишнее
Это как это?
Цитата:
Сообщение от eval Посмотреть сообщение
ну оно и так видно, а зачем оно надо?
Чтобы был список окон из которого можно было бы выбрать нужное и соответствующий ей хэндл из массива хэндлов.
Angelochek* вне форума
Старый 12.12.2013, 10:33   #10
dr.dimm
Пользователь
 
Регистрация: 15.09.2011
Сообщений: 24
По умолчанию

Привет! Ничего, если я тут напишу свой маленький вопросег, дабы не плодить кучу тем.. ?

Суть вопроса:

Код:
Dim K As double
ComboBox1.AddItem([1],[1]) = "1"
ComboBox1.AddItem([2],[2]) = "2"
ComboBox1.AddItem([3],[3]) = "3"

If ComboBox1.Value = 1 Then
K=0.15
ElseIf ComboBox1.Value = 2 Then
K=0.20
ElseIf ComboBox1.Value = 3 Then
K=0.25
End If
Как правильно будет? (Пишу в Excel на UserForm)
dr.dimm вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выбор значения ComboBox skafiend Microsoft Office Access 1 17.05.2011 11:07
выбор существующих БД из Combobox Молоток БД в Delphi 2 30.08.2010 04:40
Выбор из combobox deadneoo БД в Delphi 0 27.04.2010 19:05
Фильтрация в Delphi с помощью Combobox Веснушка_ната Помощь студентам 4 07.04.2009 02:36
Выбор программы или Открыть с помощью Умелец Свободное общение 7 14.07.2007 21:17