помогите люди добрые

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

помогите люди добрые

Сообщение Андрей_2002 » 05.12.2004 (Вс) 17:19

Такая задача:
1) активировать свернутое окно приложения
2) каким то образом эмулировать нажатие клавишь - Alt S "вниз ""вправо" enter

Помогите пожалуйста Очень ОЧЕНЬ нужно сделать эту фигню :roll:

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 05.12.2004 (Вс) 17:33

Для активации свернутого окна - SetForegroundWindow(), API-функция есть такая. Для посылок клавиш можно басиковый SendKeys использовать, а можно опять-таки API-шный SendMessage() - эта штука вообще универсальная.

А вообще, скорее всего, все это есть в примерах на этом сайте. Поройся, наверняка есть...

Андрей_2002
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 05.12.2004 (Вс) 17:13

Сообщение Андрей_2002 » 05.12.2004 (Вс) 19:09

Спасибо, что так быстро ответили, но можно поподробнее - дело в том, что я практически не сталкивался с программированием ((
но на работе получил такое задание (( (не знаю с чего они взяли, что я программист), но отвертеться от работы не получится так-что если вас не затруднит опишите подробнее как это сделать
За ранее благодарен

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 05.12.2004 (Вс) 19:26

Андрей_2002 писал(а):...я практически не сталкивался с программированием... на работе получил такое задание... не знаю с чего они взяли, что я программист

:lol:
no comment 8)

Ах, да, пример...
Код: Выделить всё
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Sub Form_Load()
Call SetForegroundWindow(Me.Hwnd)
Call SendKeys("%S")
Call SendKeys("{DOWN}")
Call SendKeys("{RIGHT}")
Call SendKeys("{ENTER}")
End Sub


Только не понятно, какое окно ты хочешь активировать, если свое (как в примере, то проше написать Me.Show), а если чужое то тебе его еще найти надо...

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Андрей_2002
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 05.12.2004 (Вс) 17:13

Сообщение Андрей_2002 » 05.12.2004 (Вс) 22:07

Спасибо за пример.
мне нужно активизировать окно не данного проекта, а программы которая свернута (кнапример - windowtool) - что нужно написать что бы развернуть эту прогу (так что-ли Call SetForegroundWindow(windowtool))

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 05.12.2004 (Вс) 22:31

Какой точно заголовок у этой программы?

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 05.12.2004 (Вс) 22:34

Вот такой пример должен работать:

Код: Выделить всё
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long

Private Sub Form_Load()
    Dim lHandle As Long
    lHandle = FindWindow(vbNullString, "xxx")
    lHandle = SetForegroundWindow(lHandle)
    Call SetForegroundWindow(Me.Hwnd)
    Call SendKeys("%S")
    Call SendKeys("{DOWN}")
    Call SendKeys("{RIGHT}")
    Call SendKeys("{ENTER}")
End Sub


Только вместо 'xxx' в кавычках должен быть точный заголовок окна той программы.

Андрей_2002
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 05.12.2004 (Вс) 17:13

Сообщение Андрей_2002 » 06.12.2004 (Пн) 7:53

Большое человеческое СПАСИБО за помощь...

Андрей_2002
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 05.12.2004 (Вс) 17:13

Сообщение Андрей_2002 » 06.12.2004 (Пн) 12:54

Извините за хлопоты, но может быть если конечно не трудно скажите как узнать значение RGB определенного (координаты известны и постоянны) пикселя (не на создаваемой программе, а вообще на любом из приложений, которые в данный момент развернуты)

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 06.12.2004 (Пн) 13:13

Использовать ф-цию GetPixel
Код: Выделить всё
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long


Она возвратит цвет в формате длинного целого, чтобы вырвать значения КЗС, используем не хитрую ф-цию
Код: Выделить всё
Function ExtractRGB(byval Color as long, byref R as byte, byref G as byte, byref B as byte)
  R=Color mod 256
  G=Color \ 256 mod 256
  B=Color \ 65536 mod 256
End Function


После этого в переданных переменных R, G и B будут содержаться данные цветности :arrow:

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Сообщение timsoft » 06.12.2004 (Пн) 18:43

всем привет
извините, что встреваю :-)

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

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 06.12.2004 (Пн) 19:24

Ну, теоретически - можно. Сначала ищем hWnd родительского окна. Потом ищем его дочерние окна, из них выбираем нужное.
Потом
Код: Выделить всё
SendMessage hWnd, WM_ACTIVATE, 1, 0

И, наконец, SendKeys.

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Сообщение timsoft » 06.12.2004 (Пн) 19:38

Amed писал(а):Потом ищем его дочерние окна


а какая функция для поиска дочерних окон? тот же FindWindow?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.12.2004 (Пн) 20:42

FindWindowEx и WM_MDIACTIVATE
Изображение

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 06.12.2004 (Пн) 21:04

Ага, спасибо за поправку. Совсем забыл, что для MDI по-другому всё. :wink:

Андрей_2002
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 05.12.2004 (Вс) 17:13

Сообщение Андрей_2002 » 07.12.2004 (Вт) 18:28

xolod писал(а):Использовать ф-цию GetPixel
Код: Выделить всё
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long


Она возвратит цвет в формате длинного целого, чтобы вырвать значения КЗС, используем не хитрую ф-цию
Код: Выделить всё
Function ExtractRGB(byval Color as long, byref R as byte, byref G as byte, byref B as byte)
  R=Color mod 256
  G=Color \ 256 mod 256
  B=Color \ 65536 mod 256
End Function


После этого в переданных переменных R, G и B будут содержаться данные цветности :arrow:



Что то я никак не пойму как указать координаты пикселя ???

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 07.12.2004 (Вт) 18:32

посмотри API ф-ю GetCursorPos

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Сообщение timsoft » 07.12.2004 (Вт) 19:43

tyomitch писал(а):FindWindowEx и WM_MDIACTIVATE


tyomitch, выручай!
объясни тупому на пальцах :-)

нифига не выходит
hwnd проги нашел, а вот вызов
Код: Выделить всё
currentDocHwnd = FindWindowEx(MainApp_hWnd, 0&, vbNullString, "c:\doc.txt")


возвращает 0 и все...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.12.2004 (Вт) 19:49

Проверь spyxx - на месте ли окно...
Если на месте, проверь, правильно ли пишешь заголовок ;-)
Больше идей нет...
Изображение

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 07.12.2004 (Вт) 19:52

Эээ. А кто вам сказал, что в вашем случае wndClassName = vbNullString ? Сколько писал, ни разу такого не видел...

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Сообщение timsoft » 07.12.2004 (Вт) 19:57

Ennor писал(а):Эээ. А кто вам сказал, что в вашем случае wndClassName = vbNullString ? Сколько писал, ни разу такого не видел...


перерыл msdn -- мало что про классы нашел
одни константы типа WS_EX_MDICHILD

че туда вписать-то? :-)
выручайте

Ennor, кстати можно на "ТЫ" :-)

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 07.12.2004 (Вт) 20:05

Когда я говорил "вы", я просто обращался ко всем участникам обсуждения. На "ты", конечно же, можно. :)
По теме: лезешь Spy++ и смотришь имя класса. Они в VB все похожие и кастомизации практ. не поддаются - типа ThunderRT6...<чегототам>. Выясни конкретное имя класса и его туда подставляй. Да: по маске он не ищет :(

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.12.2004 (Вт) 20:28

Ennor, vbNullString значит "любой класс", т.ч. в коде timsoft-а всё верно...
Изображение

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 07.12.2004 (Вт) 21:21

Проблема тут в том, что в MSDN нигде не сказано, что vbNullString = любой класс. Применительно ко всем остальным параметрам этой функции описаны ситуации, если этот/эти параметры выставлены в NULL, а для этого - нет. Так что я не удивлюсь, если в вышеуказанной форме вызова функция пытается найти окно с отсутствующим именем класса, либо равным пустой строке (а таких, насколько я понимаю, существовать не может), и, естественно, обламывается по этому поводу.

Андрей_2002
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 05.12.2004 (Вс) 17:13

Сообщение Андрей_2002 » 07.12.2004 (Вт) 22:03

Konst_One писал(а):посмотри API ф-ю GetCursorPos


Блин,,,,ничего не могу понять как указать ((((

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.12.2004 (Ср) 11:31

Кончайте страдать фигнёй...
Тёмычу плюшка за незнание этой фишки :wink:

На главном окне нужно найти окно с классом MDIClient. И вот уже в нём...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.12.2004 (Ср) 15:00

Дык я же посоветовал spyxx-ом посмотреть, вместо философию разводить... Плюшка принята.

Ennor, философия - это хорошо, но кто же мешает проверить?
Код: Выделить всё
Option Explicit

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long

Sub Main()
Dim Name As String * 256, hWnd As Long
Do
    hWnd = FindWindowEx(0, hWnd, vbNullString, vbNullString)
    If hWnd = 0 Then Exit Do
    Debug.Print Left(Name, GetClassName(hWnd, Name, 256))
Loop
End Sub
Изображение

Андрей_2002
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 05.12.2004 (Вс) 17:13

Сообщение Андрей_2002 » 08.12.2004 (Ср) 18:03

Андрей_2002 писал(а):
xolod писал(а):Использовать ф-цию GetPixel
Код: Выделить всё
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long


Она возвратит цвет в формате длинного целого, чтобы вырвать значения КЗС, используем не хитрую ф-цию
Код: Выделить всё
Function ExtractRGB(byval Color as long, byref R as byte, byref G as byte, byref B as byte)
  R=Color mod 256
  G=Color \ 256 mod 256
  B=Color \ 65536 mod 256
End Function


После этого в переданных переменных R, G и B будут содержаться данные цветности :arrow:



Что то я никак не пойму как указать координаты пикселя ???


как указать координаты пикселя ???

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 08.12.2004 (Ср) 18:14

Код: Выделить всё

Public Type POINTAPI
        x As Long
        y As Long
End Type

Public Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) As Long

'вызов такой
dim ret as long
dim pt as POINTAPI

ret=GetCursorPos(pt)
'теперь у тебя есть координаты текущей позиции курсора в pixels
debug.print pt.x
debug.print pt.y


дерзайте дальше :)

Андрей_2002
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 05.12.2004 (Вс) 17:13

Сообщение Андрей_2002 » 08.12.2004 (Ср) 22:06

Konst_One писал(а):
Код: Выделить всё

Public Type POINTAPI
        x As Long
        y As Long
End Type

Public Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) As Long

'вызов такой
dim ret as long
dim pt as POINTAPI

ret=GetCursorPos(pt)
'теперь у тебя есть координаты текущей позиции курсора в pixels
debug.print pt.x
debug.print pt.y


дерзайте дальше :)


Как это применить к вышесказанному :?:

След.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList  
cron