Конференция "WinAPI" » Как в чужом окне нажать комбинацию Ctrl-P [D6, WinXP]
 
  • Grademax (26.02.08 06:14) [0]
    Существует чужое окно. Необходимо из своего приложения нажать в чужом окне комбинацию Ctrl-P. Пробовал через PostMessage, но как сообщить параметру "Кеу" что нажата именно комбинация (Ctrl-P) я не знаю.

    Key:=Byte('P'); {??? Куда Ctrl привязать ???}
    PostMessage(Handle, WM_KEYDOWN, Key, 0);
  • Rouse_ © (27.02.08 09:48) [1]
    Через keybd_event пробуй... Только окно активным сделать не забудь.
  • Grademax (28.02.08 10:48) [2]
    Проблема как раз в том, что фокус менять нельзя, даже кратковременно!
  • Leonid Troyanovsky © (28.02.08 11:36) [3]

    > Grademax   (28.02.08 10:48) [2]

    > Проблема как раз в том, что фокус менять нельзя, даже кратковременно!

    Попробуй найти WM_COMMAND, соответствующее этому акселератору.
    См., например, как потрошить главное меню Notepad.

    --
    Regards, LVT.
  • Leonid Troyanovsky © (28.02.08 12:18) [4]

    > Leonid Troyanovsky ©   (28.02.08 11:36) [3]

    > См., например, как потрошить главное меню Notepad.

    http://groups.google.com/group/fido7.ru.delphi/msg/925bebee0309bec9

    --
    Regards, LVT.
  • MikeZ (28.02.08 13:11) [5]
    Все аналогично. Почти :)


    Procedure SendKey(H: HWnd; Key: Byte);
    Var
     vKey, ScanCode, WParam      : WORD;
     LParam, ConvKey             : LongInt;
    Begin
     ConvKey := OemKeyScan(Ord(Key));
     ScanCode := ConvKey And $000000FF Or $FF00;
     vKey := Key;
     WParam := vKey;
     LParam := LongInt(ScanCode) Shl 16;
     SendMessage(H, WM_KEYDOWN, WParam, LParam);
     SendMessage(H, WM_CHAR, WParam, LParam);
     LParam := LParam Or $C0000000;
     SendMessage(H, WM_KEYUP, WParam, LParam);
    End;

    begin
    SendMessage(H, WM_KEYDOWN, VK_CONTROL, 0);
    SendKey(H, 'P');
    SendMessage(H, WM_KEYUP, VK_CONTROL, 0);
    end;

  • MikeZ (28.02.08 13:12) [6]
    Пардон:

    begin
    SendMessage(H, WM_KEYDOWN, VK_CONTROL, 0);
    SendKey(H, Ord('P')); // <--------
    SendMessage(H, WM_KEYUP, VK_CONTROL, 0);
    end;

  • Leonid Troyanovsky © (28.02.08 13:56) [7]

    > MikeZ   (28.02.08 13:11) [5]

    > Все аналогично. Почти :)

    Ну, и попробуй послать, скажем, Ctrl+V в EDIT Notepad.

    --
    Regards, LVT.
  • MikeZ (28.02.08 14:58) [8]
    "Да, не выходит, мастер, каменный цветок" :(
    Значит, не везде этот способ работает - я его из свой программы выдрал, значит, всё же есть ситуации, где он прокатывает.
  • MikeZ (28.02.08 15:17) [9]
    Наверное, потому, что это Edit и ему WM_SETTEXT (или что там) надо делать...
  • Leonid Troyanovsky © (28.02.08 22:08) [10]

    > MikeZ   (28.02.08 15:17) [9]

    > Наверное, потому, что это Edit и ему WM_SETTEXT (или что
    > там) надо делать...

    Если про EDIT, то сойдет даже SendMessage with WM_CHAR and ^C.
    Но, для других нужен SendMessageW или еще что хужей.

    --
    Regards, LVT.
  • Leonid Troyanovsky © (28.02.08 22:19) [11]

    > Leonid Troyanovsky ©   (28.02.08 22:08) [10]

    > сойдет даже SendMessage with WM_CHAR and  ^C.

    ^V, sorry.

    --
    Regards, LVT.
  • MikeZ (28.02.08 22:38) [12]
    Ну, SendKey таки работает. Но вот Control - не получается.
  • Leonid Troyanovsky © (29.02.08 16:02) [13]

    > MikeZ   (28.02.08 22:38) [12]

    > Ну, SendKey таки работает. Но вот Control - не получается.

    Некоторые приложения обращают внимание на состояние
    клавиатуры в момент прихода WM_KEYDOWN/UP|CHAR.

    Т.е., иногда может помочь примерно такое
    http://groups.google.com/group/fido7.ru.delphi.chainik/msg/e8115e50b604ca90?dmode=source&output=gplain
    Кодировка KOI8-R

    А, в общем-то, для неактивных окон существует слишком
    большой произвол.

    --
    Regards, LVT.
 
Конференция "WinAPI" » Как в чужом окне нажать комбинацию Ctrl-P [D6, WinXP]
Есть новые Нет новых   [134431   +14][b:0][p:0.001]