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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.01.2010, 15:08   #1
Gypsy
Пользователь
 
Регистрация: 16.10.2009
Сообщений: 42
По умолчанию Вызвать хоткей в чужом приложении.

Здравствуйте, эксперты!
Подскажите, как можно вызвать хоткей в чужом приложении, зная путь к этому приложению вида "c:\1\1.exe".
Заранее спасибо!
Gypsy вне форума Ответить с цитированием
Старый 14.01.2010, 16:30   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Способов много. Ну если знаете какой хоткей, то и заголовок формы наверное известно.
Наверное, самое простое для однооконного приложения так
Код:
var
  Handle:THandle;
begin
  Handle := FindWindow(nil,'Калькулятор');
  SetForeGroundWindow(Handle);
  keybd_event(VK_MENU, 0, 0, 0);
  keybd_event(VkKeyScan('п'), 0, 0, 0);
  keybd_event(VkKeyScan('п'), 0, KEYEVENTF_KEYUP, 0);
  keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0)
eoln вне форума Ответить с цитированием
Старый 14.01.2010, 18:31   #3
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Почему всегда придумывают какие-то велосипеды с отправкой нажатия затем отпускания клавиши, при этом обязательно через keybd_event?

ctrl+Z:
Код:
message: TMessage;
...
message.LParamLo:= MOD_CONTROL;
message.LParamHi:= VK_CONTROL or ord('Z');
PostMessage(wnd, WM_HOTKEY, 0, Msg.LParam);
Как получить дескриптор окна, зная путь к приложению, ищи поиском по форуму, было где-то
пыщь
JTG вне форума Ответить с цитированием
Старый 15.01.2010, 19:50   #4
Gypsy
Пользователь
 
Регистрация: 16.10.2009
Сообщений: 42
По умолчанию

Спасибо всем!
Но вот дескриптор окна я так и не нашел, как получить. Отрыл функцию определения полного пути к файлу процесса:
Код:
uses tlhelp32, psapi;

...

function GetModulePath(PID: DWord): string;
var
  cb: DWORD;
  I: Integer;
  ProcCount: Integer;
  hMod: HMODULE;
  hProcess: THandle;
  PIDArray: array [0..1023] of DWORD;
  ModuleName: array [0..300] of Char;
begin
  FillChar(ModuleName, SizeOf(ModuleName), #0);
  EnumProcesses(@PIDArray, SizeOf(PIDArray), cb);
   ProcCount := cb div SizeOf(DWORD);
  for I := 0 to ProcCount - 1 do
   begin
    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
                            False, PIDArray[i]);
   if (hProcess <> 0) then
   begin
     EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb);
     GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName));
     if PID = PIDArray[i] then
     Result:= ModuleName;
     CloseHandle(hProcess);
   end;
   end;
end;
Таким способом я нахожу PID процесса, теперь нужно найти HWND главного окна этого процесса и потом уже туда послать хоткей.
Поможите, а?
Gypsy вне форума Ответить с цитированием
Старый 15.01.2010, 20:04   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну нет у процесса главного окна...нет такого параметра.

найдите класс главного окна приложения сами..и потом ищите его.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.02.2010, 13:05   #6
Gypsy
Пользователь
 
Регистрация: 16.10.2009
Сообщений: 42
По умолчанию

Вернулся к хоткеям, надо добить. Спасибо всем, кто оттветил. С поиском нужного окна я разобрался, теперь почему то не работает сама отправка. Пробую предложенный JTG способ. Создал форму с главным меню, где есть пункт меню с хоткеем CTRL+DEL, пробую вызвать:
Код:
procedure TForm5.Button3Click(Sender: TObject);
var smessage: TMessage;
begin
  smessage.LParamLo:= MOD_CONTROL;
  smessage.LParamHi:=VK_CONTROL or VK_DELETE;
  PostMessage(Form5.Handle, WM_HOTKEY, 0, smessage.LParam);
end;
Ничего не происходит. Что не так?
Gypsy вне форума Ответить с цитированием
Старый 27.02.2010, 11:26   #7
Gypsy
Пользователь
 
Регистрация: 16.10.2009
Сообщений: 42
По умолчанию

Господа, у кого был опыт, подскажите пожайлуста!
Gypsy вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать нажата ли кнопка(Button) в чужом приложении? progan Win Api 7 13.01.2011 09:08
Свою окно в чужом приложении russian-stalker Win Api 2 27.08.2009 11:04
Окно в чужом приложении? Volkogriz Общие вопросы Delphi 3 10.02.2009 18:22
Определить раскладу в чужом приложении. Василий Общие вопросы Delphi 3 02.01.2009 21:30