Помогите написать программку!

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Vini
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 29.03.2004 (Пн) 5:40

Помогите написать программку!

Сообщение Vini » 10.02.2005 (Чт) 21:48

Програмка что то типа сервиса, должна работать в бэкграунде, и смотреть
если откроется окно с определенным именем например (MainWin), то надо

активировать окно
выполнить Ctrl+A
Enter

Другими словами, открыть все то что выделится в том окне.

Подскажите с чего начать. Я только учюсь.
Заранее спасибо.

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 10.02.2005 (Чт) 22:11

0) Запустившись, свернуться в трэй
1) В цикле искать окно, если окно нашли, то:
2) Активировать его
3) Сэмулировать Ctrl+A
4) Сэмулировать Enter

А теперь напиши, какой пункт вызывает сложность :)

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

Сообщение Amed » 10.02.2005 (Чт) 22:41

2)
SetActiveWindow (FoundHwnd) или BringWindowToTop (FoundHwnd)
3)
SendKeys "^(a)", True
4)
SendKeys "{Enter}", True

Vini
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 29.03.2004 (Пн) 5:40

Сообщение Vini » 10.02.2005 (Чт) 22:56

Amed писал(а):2)
SetActiveWindow (FoundHwnd) или BringWindowToTop (FoundHwnd)
3)
SendKeys "^(a)", True
4)
SendKeys "{Enter}", True


На SetActiveWindow (FoundHwnd) и на BringWindowToTop (FoundHwnd)

ругается говорит что Sub or Function NOT defined

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

Сообщение Amed » 10.02.2005 (Чт) 23:02

Это API-функции... В разделе [General Declarations] (в самом вверху окна кода) надо добавить 2 строчки:

Код: Выделить всё
Private Declare Function SetActiveWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function BringWindowToTop Lib "user32" Alias "BringWindowToTop" (ByVal hwnd As Long) As Long


И надо в параметрах писать не FoundHwnd, а Hwnd найденного в пункте 1 окна...

Vini
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 29.03.2004 (Пн) 5:40

Сообщение Vini » 10.02.2005 (Чт) 23:20

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



На форме есть кнопка и текстовое поле, в поле введено имя окна куда надо преключится

Событие на клик
Код: Выделить всё
Private Sub Command1_Click()
Dim Window

Window = FindWindow(vbNullString, Text1.Text)
If Window = 0 Then
    MsgBox Text1.Text & " No window", vbCritical
Else
    MsgBox Text1.Text & " Window present", vbInformation
End If

End Sub


Дополните пожалкйста, ничего не выходит

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

Сообщение Amed » 10.02.2005 (Чт) 23:25

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

Private Sub Command1_Click()
Dim Window As Long

Window = FindWindow(vbNullString, Text1.Text)
If Window = 0 Then
    MsgBox Text1.Text & " No window", vbCritical
Else
    MsgBox Text1.Text & " Window present", vbInformation

Call SetActiveWindow (Window)
SendKeys "^(a)", True
SendKeys "{Enter}", True
End If
End Sub


Не проверял, честно говоря. Должно работать.

Vini
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 29.03.2004 (Пн) 5:40

Сообщение Vini » 10.02.2005 (Чт) 23:27

Зацикливает, и на окно не переключается :(

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

Сообщение Amed » 10.02.2005 (Чт) 23:31

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

Vini
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 29.03.2004 (Пн) 5:40

Сообщение Vini » 10.02.2005 (Чт) 23:33

Да, выскакивает MSgBox WindowPresent
при нажатии на OK, повторяется до бесконечности.
На нужное окно не переходит

Vini
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 29.03.2004 (Пн) 5:40

Сообщение Vini » 11.02.2005 (Пт) 20:29

Ну что за бред?
Код работает, только в том случае если есть кнопка
Код: Выделить всё
Private Sub Command2_Click()
    Call SetActiveWindow(Window)
    SendKeys "^(a)", True
    SendKeys "{Enter}", True
    SendKeys "{Enter}", True
End Sub


Если поставить этот код внутри Form_Load(), то не работает правильно.
Что скажите?

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 11.02.2005 (Пт) 22:06

Форма должна полностью загрузиться. Можно поставить в
Код: Выделить всё
Sub Form_Activate()
    Dim Flag As Boolean
    If Flag Then Exit Sub
    Call SetActiveWindow(Window)
    SendKeys "^(a)", True
    SendKeys "{Enter}", True
    SendKeys "{Enter}", True
    Flag = True
End Sub

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

Сообщение Amed » 11.02.2005 (Пт) 22:29

Может, SetForegroundWindow после SetActiveWindow поможет? Active - не то же самое, что и Foreground?

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

Сообщение tyomitch » 11.02.2005 (Пт) 22:47

Active - не то же самое, что Foreground. В данном случае имхо нужно именно Foreground.
Изображение

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

Сообщение Amed » 11.02.2005 (Пт) 22:57

Вот и я клоню к тому же...

tyomitch, а нельзя ли чуть подробнее объяснить разницу между активной формой и той, что на переднем плане? :D

Кажется, активная всегда на переднем плане (с фокусом), нет?
Исключая, конечно, случай с формой 'поверх всех'

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

Сообщение tyomitch » 11.02.2005 (Пт) 23:27

Активное окно - это то, у которого фокус ввода. Оно своё у каждой проги, и чаще всего это не "форма" (top-level окно), а дочернее окно (скажем, текстбокс).
Переднее окно - то, которому приходит ввод от пользователя. Оно может и не быть на переднем плане - скажем, если заслонено topmost окнами.

Если кратко, то фокус принадлежит активному ребёнку переднего окна :-)
Изображение

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

Сообщение Amed » 12.02.2005 (Сб) 18:10

А, благодарю. Воткнул, оценил. Всё предельно ясно.

Активизация ребёнка переднего окна. :D

Vini
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 29.03.2004 (Пн) 5:40

Сообщение Vini » 17.02.2005 (Чт) 22:45

Спасибо, подскажите последнее (надеюсь)
Как теперь свернуть это окно?

Спасибо.

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

Сообщение Amed » 17.02.2005 (Чт) 22:51

Код: Выделить всё
Private Declare Function CloseWindow Lib "user32" Alias "CloseWindow" (ByVal hwnd As Long) As Long

Private Sub Form_Load()
Call CloseWindow (FoundHwnd)
End Sub

Vini
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 29.03.2004 (Пн) 5:40

Сообщение Vini » 17.02.2005 (Чт) 22:55

Amed писал(а):
Код: Выделить всё
Private Declare Function CloseWindow Lib "user32" Alias "CloseWindow" (ByVal hwnd As Long) As Long

Private Sub Form_Load()
Call CloseWindow (FoundHwnd)
End Sub


Да мне его нельзя закрывать, только свернуть.

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

Сообщение tyomitch » 17.02.2005 (Чт) 22:56

А CloseWindow его и не закроет, а только свернёт.
Изображение

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

Сообщение Amed » 17.02.2005 (Чт) 22:58

API-Guide писал(а):The CloseWindow function minimizes (but does not destroy) the specified window.

Vini
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 29.03.2004 (Пн) 5:40

Сообщение Vini » 17.02.2005 (Чт) 23:26

Скажите, а можно ли открыть содержимое окна, зная только название окна?

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

Сообщение Amed » 17.02.2005 (Чт) 23:31

Можно. Кстати, что есть "содержимое"? Дочерние окна/контролы? Тогда ищите по форуму EnumWindowsEx.

Vini
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 29.03.2004 (Пн) 5:40

Сообщение Vini » 17.02.2005 (Чт) 23:45

У меня в окне есть PDF файл, мне его надо и запустить. Вот к чему и весь огород.
SendKeys "^(a)", True
SendKeys "{Enter}", True
Выполняют это, только не всегда.

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

Сообщение Amed » 17.02.2005 (Чт) 23:51

Что значит, - "в окне есть pdf файл"? В окне explorer'а?

Vini
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 29.03.2004 (Пн) 5:40

Сообщение Vini » 18.02.2005 (Пт) 1:54

Нет, у меня есть программка, которая на основании уникального номера открывает окно проводника и в нем документ PDF. Я пытаюсь написать прогу, которая откроет мне этот документ.

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

Сообщение tyomitch » 18.02.2005 (Пт) 2:37

А банального ShellExecute мало?? :shock:
Изображение

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

Сообщение Amed » 18.02.2005 (Пт) 11:42

Вот-вот...
API-Guide писал(а):Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Const SW_SHOWNORMAL = 1
Private Sub Form_Load()
'KPD-Team 1998
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
'Send an E-Mail to the KPD-Team
ShellExecute Me.hwnd, vbNullString, "C:\document.pdf", vbNullString, "C:", SW_SHOWNORMAL
End Sub

Vini
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 29.03.2004 (Пн) 5:40

Сообщение Vini » 18.02.2005 (Пт) 16:12

Amed писал(а):Вот-вот...
API-Guide писал(а):Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Const SW_SHOWNORMAL = 1
Private Sub Form_Load()
'KPD-Team 1998
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
'Send an E-Mail to the KPD-Team
ShellExecute Me.hwnd, vbNullString, "C:\document.pdf", vbNullString, "C:", SW_SHOWNORMAL
End Sub


Да наверное этого будет не достаточно.
Документ находится в DB (Documentum) и не так прямого пути к нему. Вот и открывается окошко, а в нем документ.
Может подскажите как запустить документ не зная пути, но зная имя окна? Заранее спасибо.

След.

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

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

Сейчас этот форум просматривают: SemrushBot и гости: 122

    TopList