прикрепить форму

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

прикрепить форму

Сообщение Alex2 » 05.05.2003 (Пн) 13:45

Подскажите пожалуйста как сделать так, чтобы моя форма на VB (например Form1.exe) подвешивалась к программе Word или к-л другой программе (например к нижнему правому углу) и соответственно при любых перемещениях окна Word форма тоже должна перемещаться.

Я просмотрел несколько сайтов и единственное что мне удалось это прикрепить одну форму к другой, но прикрепить форму к Word-у не удалось!!!
Form1 к form2 я прикрепил следующим образом:

Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const WM_MOVE = &H3
Public Const GWL_WNDPROC = -4
Public glPrevWndProc As Long

Public Function pMyWindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If uMsg = WM_MOVE And Form1.WindowState = vbNormal Then
Form2.Move Form1.Left - 1000, Form1.Top - 2500
End If
pMyWindowProc = CallWindowProc(glPrevWndProc, hw, uMsg, wParam, lParam)
End Function

Private Sub Form_Load()
Form2.Show
Form1.Show
glPrevWndProc = SetWindowLong(Form1.hWnd, GWL_WNDPROC, AddressOf pMyWindowProc)
End Sub

Но мне то нужно форму прикрепить не к другой форме, а Word-у!!!

Затем я нашел hwnd окна Word следующим способом:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Dim FFF As Long

FFF = FindWindow(OpusApp, vbNullString)

А ввиду того что VB я владею далеко не в совершенстве, то на этом у меня всё заглохло!!!


Подскажите что делать дальше (а лучше пришлите код, если не трудно).

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 05.05.2003 (Пн) 15:59

При таком раскладе Word должен сам посылать твоей форме сообщения об изменении своего размера, чего он естественно далать не будет :) .
Поэтому, первое, что приходит на ум - это завести на твоей форме таймер, который раз в N миллисекунд будет проверять положение Word'а и соответственно менять положение твоей формы. Хотя это уже из разряда маразмов... может не так важно, чтобы форма двигалась вместе с вордом?

goro
Постоялец
Постоялец
 
Сообщения: 494
Зарегистрирован: 03.12.2002 (Вт) 11:45
Откуда: Украина, Запорожье

Сообщение goro » 05.05.2003 (Пн) 19:37

Я пробовал делать так с Винампом. Получается что сначала винамп двигается, а потом форма. А если таймер ставить на одну милисекунду, то процессор загружается на 100 %.
Вот так вот 8)
ПРЕВЕД

ASD
Модератор
Модератор
Аватара пользователя
 
Сообщения: 1758
Зарегистрирован: 07.12.2001 (Пт) 21:08
Откуда: Russia

Сообщение ASD » 06.05.2003 (Вт) 11:22

Думаю тут надо из твоей проги запускать Word.
Причем Word является ActiveX.EXE тоесть можно его подключить в твоей проге и отуда его тащить.
Код: Выделить всё
Dim Word As Object
Set Word = CreateObject("Word.Application")
frmView.Web.ExecWB OLECMDID_SELECTALL, OLECMDEXECOPT_DONTPROMPTUSER
frmView.Web.ExecWB OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT
frmView.Web.ExecWB OLECMDID_CLEARSELECTION, OLECMDEXECOPT_PROMPTUSER
'word.Documents.Add
Word.Documents.Add.content.Paste
Word.Visible = True
Set Word = Nothing


Вот примерчик как я вставлял через буфер в ворд (перед этим его создавая.)
Я так мыслю что если обьявить его с Eventами то может можно и до его состояния долезть.
Moderator VBStreets
---------------------------

lenar
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 23.08.2003 (Сб) 14:34

Сообщение lenar » 25.08.2003 (Пн) 23:22

А может SetParent поможет
The best from the VB

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 26.08.2003 (Вт) 9:44

Private Sub Form_Load()
Form2.Show
Form1.Show
glPrevWndProc = SetWindowLong(Form1.hWnd, GWL_WNDPROC, AddressOf pMyWindowProc)
End Sub

В данном примере ты ставишь хук на форму Form1. А тебе надо ставить хук на Word. Т.е. находишь хэндл окна Word (через FindWindow) и этот хэндл подставляешь на место Form1.hWnd. Только у меня есть подозрения, что WinXP не позволит так просто ставить хук на чужое окно, но попробуй.
Только учти одно: при выгрузке формы или Word обязательно нужно снимать хук.
Lasciate ogni speranza, voi ch'entrate.


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

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

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

    TopList  
cron