Как имитировать Ctrl+S

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
dima-pol
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 03.11.2008 (Пн) 17:47

Как имитировать Ctrl+S

Сообщение dima-pol » 28.01.2013 (Пн) 20:57

Для имитации нажатия клавиши «S» в текстовом поле чужого приложения я использую команду:
Код: Выделить всё
SendMessage tbTest.hwnd, WM_CHAR, vbKeyS, ByVal 0

А как симитировать одновременное нажатие «Ctrl» + «S» ?

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Как имитировать Ctrl+S

Сообщение FireFenix » 28.01.2013 (Пн) 21:08

Кроме книг, ещё существует msdn! Т.е. техническая документация от микрософт...

http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 28.01.2013 (Пн) 21:35

Обращаю внимание, что регистр буквы S а также текущий язык могут оказаться важны.

dima-pol
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 03.11.2008 (Пн) 17:47

Re: Как имитировать Ctrl+S

Сообщение dima-pol » 28.01.2013 (Пн) 22:23

FireFenix писал(а):Кроме книг, ещё существует msdn! Т.е. техническая документация от микрософт...

http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Я конечно же смотрел эту статью MSDN , но у меня сложилось впечатление что WM_CHAR позволяет задать одновременное нажатие только "Alt", но не "Ctrl" (меня больше интересует левый) . Или я не прав?

Qwertiy писал(а):Обращаю внимание, что регистр буквы S а также текущий язык могут оказаться важны.

Как для WM_CHAR можно установить регистр?
Может Вы про SendKeys "^s". SendKeys мне не подходит.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как имитировать Ctrl+S

Сообщение Хакер » 28.01.2013 (Пн) 22:25

Терпеть не могу, когда люди пользуются заклинаниями.

«Инопланетные гуру написали код — мне же дураку предстоит им только пользоваться, совершено не понимая код».

Вот ваша философия.

Почему ты отправляешь именно WM_CHAR? Почему не WM_KEYxxx-собщения? Ты знаешь, что их связывает между собой? Ты знаешь, как между этими двумя вещами стоит TranslateMessage? А TranslateAccelerator?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 29.01.2013 (Вт) 1:54

dima-pol писал(а):Может Вы про SendKeys "^s". SendKeys мне не подходит.

Не пользовался им в VB6... Хотя да, подумал как раз про него.
А это так и не доделал :(

Filyus
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 07.07.2011 (Чт) 11:54

Re: Как имитировать Ctrl+S

Сообщение Filyus » 06.03.2013 (Ср) 20:16

Вообще-то тут, как понял, не про текст речь идёт.
Код: Выделить всё
Private Sub Command1_Click()
  Dim hwnd As Long
  hwnd = FindWindow("Notepad", vbNullString)
  SetForegroundWindow hwnd
  keybd_event vbKeyControl, 0, 0, 0
  keybd_event vbKeyS, 0, 0, 0
  keybd_event vbKeyS, 0, KEYEVENTF_KEYUP, 0
  keybd_event vbKeyControl, 0, KEYEVENTF_KEYUP, 0
End Sub

Чуть посложнее - на случай если нужно отправлять сочетание когда окно вашего приложения неактивно.
Код: Выделить всё
Private Sub Timer1_Timer()
  Timer1.Enabled = False
  Command1_Click
End Sub
Private Sub Command1_Click()
  Dim hwnd As Long
  Dim MyThreadId As Long, OtherThreadId As Long, ForegroundThreadId As Long
  hwnd = FindWindow("Notepad", vbNullString)
  MyThreadId = GetCurrentThreadId
  ForegroundThreadId = GetWindowThreadProcessId(GetForegroundWindow, ByVal 0)
  If MyThreadId = ForegroundThreadId Then
    SetForegroundWindow hwnd
    SendCtrlS
  Else
    OtherThreadId = GetWindowThreadProcessId(hwnd, ByVal 0)
    AttachThreadInput MyThreadId, OtherThreadId, 1
      SetFocusWindow hwnd
      SendCtrlS
    AttachThreadInput MyThreadId, OtherThreadId, 0
  End If
End Sub
Private Sub SendCtrlS()
  keybd_event vbKeyControl, 0, 0, 0
  keybd_event vbKeyS, 0, 0, 0
  keybd_event vbKeyS, 0, KEYEVENTF_KEYUP, 0
  keybd_event vbKeyControl, 0, KEYEVENTF_KEYUP, 0
End Sub

О том, почему нельзя использовать PostMessage для этой цели:
http://blogs.msdn.com/b/oldnewthing/arc ... 23202.aspx


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 66

    TopList