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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с чужими прогами 
:(
    Опции темы
danilsl
Дата 15.3.2006, 02:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Как мне из моей проги сказать другой, например винампу, что была нажата определённая комбинация клавиш?



PS. Пожалуйста ответте, я новичок в программировании и хочу только заюзать пульт от тв-тюнера для управления другими прогами.


M
Girder
Одна тема - один вопрос!


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


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


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

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



Смотри SDK Winamp(если для него или для другой проги)


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

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


Новичок



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

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



WinAmp управляется через систему сообщений, смотри сдк, у тебя получится что-то вроде SendMessage(winamp_hwnd,тут команды).
Кстати СДК для винампа написано и для делфи (неофицальное, смотри форум винампа)

Если нужна функция для нажатия кнопок то вот:

Код

procedure PostKeyExHWND(hWindow: HWnd; key: Word; const shift: TShiftState;
   specialkey: Boolean);
type
   TBuffers = array [0..1] of TKeyboardState;
 var
   pKeyBuffers: ^TBuffers;
   lParam: LongInt;
 begin
   (* check if the target window exists *)
   if IsWindow(hWindow) then
   begin
     (* set local variables to default values *)
     pKeyBuffers := nil;
     lParam := MakeLong(0, MapVirtualKey(key, 0));

     (* modify lparam if special key requested *)
     if specialkey then
       lParam := lParam or $1000000;

     (* allocate space for the key state buffers *)
     New(pKeyBuffers);
     try
       (* Fill buffer 1 with current state so we can later restore it.
          Null out buffer 0 to get a "no key pressed" state. *)
       GetKeyboardState(pKeyBuffers^[1]);
       FillChar(pKeyBuffers^[0], SizeOf(TKeyboardState), 0);

       (* set the requested modifier keys to "down" state in the buffer*)
       if ssShift in shift then
         pKeyBuffers^[0][VK_SHIFT] := $80;
       if ssAlt in shift then
       begin
         (* Alt needs special treatment since a bit in lparam needs also be set *)
         pKeyBuffers^[0][VK_MENU] := $80;
         lParam := lParam or $20000000;
       end;
       if ssCtrl in shift then
         pKeyBuffers^[0][VK_CONTROL] := $80;
       if ssLeft in shift then
         pKeyBuffers^[0][VK_LBUTTON] := $80;
       if ssRight in shift then
         pKeyBuffers^[0][VK_RBUTTON] := $80;
       if ssMiddle in shift then
         pKeyBuffers^[0][VK_MBUTTON] := $80;

       (* make out new key state array the active key state map *)
       SetKeyboardState(pKeyBuffers^[0]);
       (* post the key messages *)
       if ssAlt in Shift then
       begin
         PostMessage(hWindow, WM_SYSKEYDOWN, key, lParam);
         PostMessage(hWindow, WM_SYSKEYUP, key, lParam or $C0000000);
       end
       else
       begin
         PostMessage(hWindow, WM_KEYDOWN, key, lParam);
         PostMessage(hWindow, WM_KEYUP, key, lParam or $C0000000);
       end;
       (* process the messages *)
       Application.ProcessMessages;

       (* restore the old key state map *)
       SetKeyboardState(pKeyBuffers^[1]);
     finally
       (* free the memory for the key state buffers *)
       if pKeyBuffers <> nil then
         Dispose(pKeyBuffers);
     end; { If }
   end;
 end; { PostKeyEx }


Взял из DelphiWorld, еще рекомендую поставить паузу, для того чтобы прога успела отреагировать.
П.С. Кстати эта функция удобнее чем та которая в DRKB, неплохо бы обновить.
PM MAIL   Вверх
danilsl
Дата 18.3.2006, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Попробовал функцию PostKeyExHWND, реакции со стороны винампа - ноль. Вдобавок при первом вызове этой функции нажатая клавиша почемуто попадает в дельфу (моя прога запускается свёрнутая в трей). Решил посмотреть чево из себя представляют функции GetKeyboardState и SetKeyboardState. Написал такую дрянь:
Код

procedure TForm1.Timer1Timer(Sender: TObject);
var
  ks:TKeyboardState;
  buf:byte;
  str:string;
  i:integer;
begin
  GetKeyboardState(ks);
  str:='';
  for i:=0 to 254 do begin
    buf:=ks[i];
    str:=str+IntToHex(buf,1);
    Label1.Caption:=str;
  end;
end;

Timer1.Intervar:=20;
Пощёлкал клавиши в етой проге - не интересно. Самое интересное вылезло когда форма перестала быть активной. Чё бы я не жал на клаве текст лабела не менялся. Отсюда напрашивается вывод, что винда для каждой проги создаёт экземпляр TKeyboardState отсюда и отсутствие реакции винампа - все альты и контролы получается я шлю СВОЕЙ ПРОГЕ! а до винампа доходят только остатки. Так какже всётаки сообщить об альте и контроле именно чужой проге, а не своей?

Перед вызовом PostKeyExHWND пробовал Windows.SetForegroundWindow(h) и Windows.SetFocus(h). Тоже не помогает.
PM MAIL   Вверх
Msl
Дата 23.3.2006, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Маленький SendKey Engine От Utilmind:
Код


{****************************************************}
{              SendKeys Unit for Delphi 32           }
{    Copyright (c) 1999 by Borut Batagelj (Slovenia) }
{                       Aleksey Kuznetsov (Ukraine)  }
{            Home Page: www.utilmind.com             }
{            E-Mail: [email protected]               }
{****************************************************}

unit SendKeys;

interface

uses
  Windows, SysUtils;

const
  SK_BKSP = #8;
  SK_TAB = #9;
  SK_ENTER = #13;
  SK_ESC = #27;
  SK_ADD = #107;
  SK_SUB = #109;
  SK_F1 = #228;
  SK_F2 = #229;
  SK_F3 = #230;
  SK_F4 = #231;
  SK_F5 = #232;
  SK_F6 = #233;
  SK_F7 = #234;
  SK_F8 = #235;
  SK_F9 = #236;
  SK_F10 = #237;
  SK_F11 = #238;
  SK_F12 = #239;
  SK_HOME = #240;
  SK_END = #241;
  SK_UP = #242;
  SK_DOWN = #243;
  SK_LEFT = #244;
  SK_RIGHT = #245;
  SK_PGUP = #246;
  SK_PGDN = #247;
  SK_INS = #248;
  SK_DEL = #249;
  SK_SHIFT_DN = #250;
  SK_SHIFT_UP = #251;
  SK_CTRL_DN = #252;
  SK_CTRL_UP = #253;
  SK_ALT_DN = #254;
  SK_ALT_UP = #255;

procedure SendKeyString(Text: String);
procedure SendKeysToTitle(WindowTitle: String; Text: String);
procedure SendKeysToHandle(WindowHandle: hWnd; Text: String);
procedure MakeWindowActive(wHandle: hWnd);
function GetHandleFromWindowTitle(TitleText: String): hWnd;

implementation

procedure SendKeyString(Text: String);
var
   i: Integer;
   Shift: Boolean;
   vk, ScanCode: Word;
   ch: Char;
   c, s: Byte;
const
   vk_keys: Array[0..9] of Byte =
      (VK_HOME, VK_END, VK_UP, VK_DOWN, VK_LEFT,
       VK_RIGHT, VK_PRIOR, VK_NEXT, VK_INSERT, VK_DELETE);
   vk_shft: Array[0..2] of Byte = (VK_SHIFT, VK_CONTROL, VK_MENU);
   flags: Array[False..True] of Integer = (KEYEVENTF_KEYUP, 0);
begin
   Shift := False;
   for i := 1 to Length(Text) do
    begin
     ch := Text[i];
     if ch >= #250 then
      begin
       s := Ord(ch) - 250;
       Shift := not Odd(s);
       c := vk_shft[s shr 1];
       ScanCode := MapVirtualKey(c,0);
       Keybd_Event(c, Scancode, Flags[shift], 0);
      end
     else
      begin
       vk := 0;
       if ch >= #240 then
        c := vk_keys[Ord(ch) - 240]
       else
        if ch >= #228 then {228 (F1) => $70 (vk_F1)}
         c := Ord(ch) - 116
        else
         if ch < #110 then
          c := Ord(ch)
         else
          begin
           vk := VkKeyScan(ch);
           c := LoByte(vk);
          end;
       ScanCode := MapVirtualKey(c,0);
       if not Shift and (Hi(vk) > 0) then { $2A = scancode of VK_SHIFT }
        Keybd_Event(VK_SHIFT, $2A, 0, 0);
       Keybd_Event(c,scancode, 0, 0);
       Keybd_Event(c,scancode, KEYEVENTF_KEYUP, 0);
       if not Shift and (Hi(vk) > 0) then
        Keybd_Event(VK_SHIFT, $2A, KEYEVENTF_KEYUP, 0);
      end;
    end;
end;

procedure MakeWindowActive(wHandle: hWnd);
begin
  if IsIconic(wHandle) then
   ShowWindow(wHandle, SW_RESTORE)
  else
   BringWindowToTop(wHandle);
end;

function GetHandleFromWindowTitle(TitleText: String): hWnd;
var
  StrBuf: Array[0..$FF] of Char;
begin
  Result := FindWindow(PChar(0), StrPCopy(StrBuf, TitleText));
end;

procedure SendKeysToTitle(WindowTitle: String; Text: String);
var
  Window: hWnd;
begin
  Window := GetHandleFromWindowTitle(WindowTitle);
  MakeWindowActive(Window);
  SendKeyString(Text);
end;

procedure SendKeysToHandle(WindowHandle: hWnd; Text: String);
begin
  MakeWindowActive(WindowHandle);
  SendKeyString(Text);
end;

end.


Удачи!
PM MAIL   Вверх
danilsl
Дата 25.3.2006, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо всем. keybd_event нашёл сам в дельфишном хелпе. Кстати для того чтобы передать проге к примеру комбинацию alt+Enter вовсе не обязательно её активировать. У меня прокатил такой вариант даже для свёрнутых прог(Пишу по памяти, если посадил ошибку не ругайтесь):

Код


keybd_event(18,MapVirtualKey(VK_MENU,0),0,0);
Sleep(50);
postMessage(Handle,WM_KEYDOWN,VK_RETURN,MapVirtualKey(VK_RETURN,0));
postMessage(Handle,WM_KEYUP,VK_RETURN,MapVirtualKey(VK_RETURN,0));
keybd_event(18,MapVirtualKey(VK_MENU,0),KEYEVENTF_KEYUP,0);


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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