Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Блокировка клавиатуры, Обработка нажатий клавиш 
:(
    Опции темы
Rommik
Дата 4.9.2006, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 21.11.2005

Репутация: нет
Всего: нет



В моем проекте есть DBGRID. При нажатии на нем определенных клавиш клавиатуры запускаются сторонние приложения с своими окнами и обрабатывают текущие записи грида. Так вот, при мгновенном нажатии, например Entera, запускается стороннее приложение, но фокус ввода остается на моей форме. Как бы мне передавать фокус в новое окно?? Если нажатие на клавиши происходит с некоторым интервалом, то все Ок, фокус на запущенном приложении. Как мне поступить???
PM MAIL   Вверх
Rodman
Дата 4.9.2006, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 7
Всего: 122



Цитата(Rommik @  4.9.2006,  18:18 Найти цитируемый пост)
запускается стороннее приложение


Так это у тя совсем другой ЕХЕшник или другая форма???


Если другая форма то
Код

Form2.SetFocus;

PM MAIL WWW Skype GTalk YIM MSN   Вверх
Fedia
Дата 5.9.2006, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 8
Всего: 13



Цитата(Rommik @  4.9.2006,  18:18 Найти цитируемый пост)
При нажатии на нем определенных клавиш клавиатуры запускаются сторонние приложения с своими окнами и обрабатывают текущие записи грида.

А зачем все так сложно закрученно ?

Цитата(Rommik @  4.9.2006,  18:18 Найти цитируемый пост)
Как бы мне передавать фокус в новое окно??

На запущенное приложение ?
Если запускать проложение напримет вот так:
Код

ShellExecute(0, 'open', 'test.exe', nil, nil, SW_SHOWNORMAL)
, то запущенное приложение автоматом получает фокус ввода. Если же фокус теряется, то можно опять передать ему фокус так:
Код

var
  h: Integer;
  AHWND: HWND;
begin
  AHWND:=FindWindow(nil, 'Тест');
  h := GetWindowLong(AHWND, GWL_HWNDPARENT);
  if IsIconic(h) then
  ShowWindow(h, SW_RESTORE);
  SetForegroundWindow(h);
end;
, где 'Тест' - заголовок окна запущенного приложения. Но лучше разобраться с причиной потери фокуса приложением.


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
bazzzman
Дата 5.9.2006, 03:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 24.7.2006

Репутация: 0
Всего: 2



SetForegroundWindow(h); не всегда работает. Но в данном случае работать будет.

Цитата
A process can set the foreground window only if one of the following conditions is true: 

The process is the foreground process. 
The process was started by the foreground process. 
The process received the last input event. 
There is no foreground process. 
The foreground process is being debugged. 
The foreground is not locked (see LockSetForegroundWindow). 
The foreground lock time-out has expired (see SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo). 
Windows 2000/XP: No menus are active.

PM MAIL WWW   Вверх
Rommik
Дата 5.9.2006, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 21.11.2005

Репутация: нет
Всего: нет



Запускается другой ехешник. Мне нужно дождаться завершения работы ехешника.
PM MAIL   Вверх
Romikgy
Дата 5.9.2006, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(Rommik @  5.9.2006,  09:44 Найти цитируемый пост)
Запускается другой ехешник

после этого поставь в своем приложении или Sleep(500); или юзай
WaitForSingleObject(хендл процесса, время ожидания);
если поставить время ожидания INFINITE будет ждать вечно пока не закроется вызваное тобой приложение


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Rommik
Дата 5.9.2006, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 21.11.2005

Репутация: нет
Всего: нет



Так и сделано. Но все равно при мгновенном нажатии клавиш запускается стороннее приложение а фокус ввода остается на моей форме.
PM MAIL   Вверх
Romikgy
Дата 5.9.2006, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Rommik, исходник в студию


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Rommik
Дата 5.9.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 21.11.2005

Репутация: нет
Всего: нет



Код





Fillchar(startinfo,Sizeof(startinfo),#0);
startinfo.cb:=Sizeof(startinfo);
startinfo.dwFlags:=STARTF_USESHOWWINDOW;
h:=FindWindow(pchar('TMainForm'),pchar(MainForm.caption));
EnableWindow(h,False);
MainForm.Enabled:=false;
if not CreateProcess(nil, p1, nil, nil, true, REALTIME_PRIORITY_CLASS, nil, p2, startinfo,procinfo) then
                                begin
                                         MainForm.Enabled:=true;
                                         EnableWindow(h,True);
                                         Exit;
                                end;
                hh:=Procinfo.dwThreadId;
                        repeat
                                case WaitForSingleObject(Procinfo.hProcess, 10) of
                                        WAIT_OBJECT_0: Break;
                                        WAIT_TIMEOUT: MainForm.Repaint;
                                else
                                        RaiseLastOSError;
                                end;
                                Application.Restore;
                        until False;

                        CloseHandle( Procinfo.hProcess );
                        CloseHandle( Procinfo.hThread );
                        Application.Restore;

                MainForm.Enabled:=true;
                EnableWindow(h,True);


PM MAIL   Вверх
Демо
Дата 5.9.2006, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Код

//Запуск процесса
function ExecCmd(const aPath,aCommand: String;const aShow, aWaitExit: Boolean): Integer;
var
  pi:PROCESS_INFORMATION;
  si:STARTUPINFO;
  cmdLine: String;
  isOk: Boolean;
  Ret: DWord;
begin
  ZeroMemory(@si,sizeof(si));
  si.cb:=SizeOf(si);
  si.dwFlags := STARTF_FORCEONFEEDBACK+STARTF_USESHOWWINDOW;
  if aShow then si.wShowWindow := (SW_SHOWNORMAL) else si.wShowWindow := SW_HIDE;
  cmdLine := aCommand;

  isOk :=
         CreateProcess( nil,             // No module name (use command line).
                        PChar(cmdLine),  // Command line.
                        nil,             // Process handle not inheritable.
                        nil,             // Thread handle not inheritable.
                        False,           // Set handle inheritance to FALSE.
                        0,               // No creation flags.
                        nil,             // Use parent's environment block.
                        PChar(aPath),     // Use parent's starting directory.
                        si,              // Pointer to STARTUPINFO structure.
                        pi );             // Pointer to PROCESS_INFORMATION structure.
  if isOk then
  begin
    CloseHandle(pi.hThread);
    try
      if aWaitExit then WaitForSingleObject( pi.hProcess, INFINITE );
      GetExitCodeProcess(pi.hProcess,Ret);
      Result := Ret;
    finally
      CloseHandle(pi.hProcess);
    end;
  end
  else Result := -1;
end;



--------------------
    
PM MAIL ICQ Skype   Вверх
Rommik
Дата 5.9.2006, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 21.11.2005

Репутация: нет
Всего: нет



Все отлично. Но все равно при мгновенном нажатии клавиш запускается стороннее приложение а фокус ввода остается на моей форме. Как мне активировать стороннее приложение, когда известно только имя ехешника???
PM MAIL   Вверх
dumb
Дата 5.9.2006, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 13
Всего: 158



EnumWindows + GetWindowModuleFileName + SetForegroundWindow
PM MAIL   Вверх
Elfebet
Дата 5.9.2006, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 2
Всего: 14



а какое ты действие обрабатываеш при нажатии клавиши onkeypress или onkeypressdown?
я к тому шо может быть у тя при нажатии клавиши фокус переходит на твой компонент, елси да то попробуй
Код

windowPrev:=GetNextWindow(Handle, GW_HWNDPREV);
SetActiveWindow(windowPrev);


Добавлено @ 18:21 
 smile 


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
Romikgy
Дата 5.9.2006, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(Rommik @  5.9.2006,  12:42 Найти цитируемый пост)
 end;                                Application.Restore;

на кой?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Rommik
Дата 7.9.2006, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 21.11.2005

Репутация: нет
Всего: нет



Restore делаю для того, чтобы при передвижении запущенной программы на моей форме не было белого шлейфа.
PM MAIL   Вверх
Romikgy
Дата 7.9.2006, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



попробуй заменить на Application.ProcessMessage


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0716 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.