Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> пердать нажатие клавиши конкретному окну 
:(
    Опции темы
Dad
Дата 12.11.2002, 08:06 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











ниже приведенная муть эмулирует нажатие клавиши, а
как послать нажатие клавиши конкретному окну (неактивному)

Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, _
ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Const KEYEVENTF_EXTENDEDKEY = &H1
Const KEYEVENTF_KEYUP = &H2
Const VK_Enter = &HD
'''''''''''''''''''''''''''''''''''''''''''
Private Timer1_Timer()
   keybd_event VK_Enter, 0, 0, 0  ' нажимаем
   keybd_event VK_Enter, 0, KEYEVENTF_KEYUP, 0  ' отпускаем

надо послать неактивному конкретному окну, кто играл в Ультиму Онлайн тот поймет,
я хочу зделать себе макркр который не будет захватывать управление компом,
чтоб я мог играть и лазить в инете одновременно....
  Вверх
Vit
Дата 12.11.2002, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


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

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



SendMessage
PostMessage


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Dad
Дата 12.11.2002, 19:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











ну блин, сенк конечно, но это я сам врубился, просто очень давно не писал... мне подробней надо вот как я написал так же напиши плиз.....
1) декларация:
      SendMessage
      PostMessage
2) пример вызова:
      SendMessage
      PostMessage
  Вверх
Dad
Дата 13.11.2002, 00:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











ой извини за прошлый топик это я чет втупил... давно не писал...
короче задаю вопрос по другому :

как послать нажатие клавиши НЕ АКТИВНОМУ окну зная его hwnd и заголовок ??????
вот такая фича, закрыть это окно я могу , а вот эмулировать нажатие F1  не получается,
че я неправильно делаю????
мне надо чтоб в НЕ АКТИВНОМ окне (игра)
по таймеру нажимались клавиши(F1, F2, ...)
может вообше можно как то по другому???? короче обязательно надо, чтоб
нажатие клавишь ловило НЕ АКТИВНОЕ окно.
это для игры Ультима Онлайн, там на клавиши можно написать
макрос и нажимая клавишу будет выполняться действие,
но это занимает комп,
я видел для нее самопальные проги,
которые жмут клавиши в неактивном окне игры,
но они хреново написаны и слишком тормозят комп...
'------------------------------------------
Private Declare Function FindWindow Lib "user32" _
         Alias "FindWindowA" (ByVal lpClassName As String, _
               ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" _
         Alias "PostMessageA" (ByVal hwnd As Long, _
               ByVal wMsg As Long, ByVal wParam As Long, _
                    ByVal lParam As Long) As Long
'''''''''Const VK_F1 = &H70
'''''''''Const WM_QUIT = &H12
Dim hW As Long
'----------------------------------------------
Private Sub tim1_Timer()
hW = FindWindow(vbNullString, "Безымянный - Блокнот" & Chr(0))
Call PostMessage(hW, &H12, 0, 0) 'работает блокнот закрывается !!!!!
   ''' Call PostMessage(hW, &H70, 0, 0) 'НЕ РАБОТАЕТ  !!!!!
  Вверх
Vit
Дата 13.11.2002, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


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

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



VK_F1 - это не сообщение, это код клавиши, а сообщение - WM_KEYDOWN и WM_KEYUP  
Лично я это не делал, так что практическую консультацию не дам. Вот отрывок из хэлпа по WM_KEYDOWN


The WM_KEYDOWN message is posted to the window with the keyboard focus when a nonsystem key is pressed. A nonsystem key is a key that is pressed when the ALT key is not pressed.

WM_KEYDOWN  
nVirtKey = (int) wParam;    // virtual-key code
lKeyData = lParam;          // key data


Parameters

nVirtKey

Value of wParam. Specifies the virtual-key code of the nonsystem key.

lKeyData

Value of lParam. Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in the following table:

Value Description
0-15 Specifies the repeat count. The value is the number of times the keystroke is repeated as a result of the user holding down the key.
16-23 Specifies the scan code. The value depends on the original equipment manufacturer (OEM).
24 Specifies whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0.
25-28 Reserved; do not use.
29 Specifies the context code. The value is always 0 for a WM_KEYDOWN message.
30 Specifies the previous key state. The value is 1 if the key is down before the message is sent, or it is 0 if the key is up.
31 Specifies the transition state. The value is always 0 for a WM_KEYDOWN message.


Return Values

An application should return zero if it processes this message.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Dad
Дата 14.11.2002, 20:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











мда... ну то что это не сообшене дошло, но толку от хелпа мало...
ниче у меня не вышло....
  Вверх
Dad
Дата 17.11.2002, 03:44 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











мде... все просто оказалось....

const WM_KEYDOWN = &H100
const VK_F1 =&H70

Call PostMessage(hW, WM_KEYDOWN , VK_F1 , 1)

и работает как в сказке !
  Вверх
kapbepucm
Дата 16.6.2007, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 993
Регистрация: 14.6.2007
Где: Латвия

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



A не подскажите, как тому-же окну послать сообщение о нажатии и отпуске клавиши [W]?


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
cardinal
Дата 16.6.2007, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


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

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



Найди константу от этой буквы в том же MSDN...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Tectoder
Дата 17.6.2007, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Call PostMessage(hW, WM_KEYDOWN , VK_F1 , 1)
...
Call PostMessage(hW, WM_KEYUP , VK_F1 , 1)
?


PM   Вверх
cardinal
Дата 17.6.2007, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


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

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



Это вопрос?


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
kapbepucm
Дата 18.6.2007, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 993
Регистрация: 14.6.2007
Где: Латвия

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



"Найди константу от этой буквы в том же MSDN... "

Как я понял, здесь последний параметр играет большую роль. В данном случае функциональная клавиша [F1] "работает как в сказке", но написав нижеприведённое, поменяв на [W], как вы предложили:

    Dim HWND As Long
    Shell "c:\windows\system32\notepad.exe", vbMaximizedFocus
    HWND = GetForegroundWindow
    PostMessage HWND, WM_KEYDOWN, VK_W, 1
    PostMessage HWND, WM_CHAR, VK_W, 1
    PostMessage HWND, WM_KEYUP, VK_W, 1

результата я не увидел. Помогите разобраться с последним параметром для PostMessage c WM_KEYDOWN! 


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
cardinal
Дата 18.6.2007, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


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

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



Код покажи полностью...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
kapbepucm
Дата 18.6.2007, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 993
Регистрация: 14.6.2007
Где: Латвия

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



В идеале я хочу, что-бы в текстовом редакторе вывелась буква "W", ещё лучше, если-бы вывелась в неактивном окне (для активнивного- kbd_event подходит). Для клавиши[F1] "работает как в сказке":

Код

        Public Const VK_F1 As Byte = &H70 'F1 key
        Public Const VK_W As Byte = &H57 'W key
        Public Const WM_KEYDOWN As Long = &H100
        Public Const WM_KEYUP As Long = &H101
        Public Const WM_CHAR As Long = &H102
        Public Declare Function GetForegroundWindow Lib "user32.dll" () As Long
        Public Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal HWND As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

' дальше основной код:

        Dim HWND As Long
        Shell "c:\windows\system32\notepad.exe", vbMaximizedFocus
        HWND = GetForegroundWindow' не самое лучшее решение найти handle, но всё-же 
        call PostMessage (HWND, WM_KEYDOWN, VK_F1, 1)
        call PostMessage (HWND, WM_CHAR, VK_F1, 1)
        call PostMessage (HWND, WM_KEYUP, VK_F1, 1)


...но если вместо VK_F1 написать VK_W, то результата я не ощущаю :(

код, который не работает:

Код

call  PostMessage (HWND, WM_KEYDOWN, VK_W, &H1570001)
call  PostMessage (HWND, WM_CHAR, VK_W, &H41570001)
call  PostMessage (HWND, WM_KEYUP, VK_W, &HC1570001)


Короче, разъясните непонятливым, что написать в lParam (проблема явно там), ну хотя-бы для активного окна, но обязательно используя PostMessage!

Это сообщение отредактировал(а) kapbepucm - 18.6.2007, 15:49


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
bom
Дата 18.6.2007, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

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



Тренируйся:
Код

Option Explicit
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal HWND As Long, _
ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function FindWindow& Lib "user32" Alias "FindWindowA" (ByVal lpClassName$, _
                                                                        ByVal lpWindowName$)
Private Declare Function FindWindowEx& Lib "user32" Alias "FindWindowExA" (ByVal hWndParent&, _
                              ByVal hWndChildAfter&, ByVal lpClassName$, ByVal lpWindowName$)

Private Sub Form_Load()
Shell "notepad", vbMinimizedNoFocus
SendMessage FindWindowEx(FindWindow("Notepad", vbNullString), 0, "Edit", ""), &HC, 0, ByVal _
"Печатаем букву W в свернутом неактивном дочернем окне Edit блокнота:" & vbCrLf & "W"
End Sub


Добавлено через 8 минут и 38 секунд
Цитата(kapbepucm @  18.6.2007,  13:31 Найти цитируемый пост)
но обязательно используя PostMessage


Код

Private Sub Command1_Click()
        Dim HWND As Long
        Shell "c:\windows\system32\notepad.exe", vbMaximizedFocus
        HWND = FindWindowEx(GetForegroundWindow, 0, "Edit", "")
        Call PostMessage(HWND, WM_CHAR, VK_W, 1)
End Sub


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

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

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

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

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


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

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


 




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


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

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