Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Окно стороннего приложения внутри VB-формы Добавлено: 08.08.07 23:47  

Автор вопроса:  Zahar | Web-сайт: partnerka-ru.info
Помогите несмышленышу.
Как сделать так, чтобы окно другого приложения, скажем Exсel размещалось внутри созданной VB-формы. Без всяких там OLE. Просто надо чтобы окно, в том виде, как мы видим его обычно (с тулбарами, полосами прокрутки и т.д.) не выходило за пределы созданной формы.

Ответить

  Ответы Всего ответов: 10  

Номер ответа: 1
Автор ответа:
 Mr.Smile



ICQ: 427682013 

Вопросов: 14
Ответов: 464
 Профиль | | #1 Добавлено: 09.08.07 00:30
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function Putfocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
Const GW_HWNDNEXT = 2
Dim mWnd As Long
Function InstanceToWnd(ByVal target_pid As Long) As Long
    ;Dim test_hwnd As Long, test_pid As Long, test_thread_id As Long
    test_hwnd = FindWindow(ByVal 0&, ByVal 0&;)
    ;Do While test_hwnd <> 0
        If GetParent(test_hwnd) = 0 Then
            test_thread_id = GetWindowThreadProcessId(test_hwnd, test_pid)
            If test_pid = target_pid Then
                InstanceToWnd = test_hwnd
                Exit Do
            End If
        End If
        test_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT)
    Loop
End Function
Private Sub Form_Load()
    ;Dim Pid As Long
    LockWindowUpdate GetDesktopWindow
    Pid = Shell("c:\windows\notepad.exe", vbNormalFocus) 'замени "c:\windows\notepad.exe" на путь к Excel
    If Pid = 0 Then MsgBox "Error starting the app"
    mWnd = InstanceToWnd(Pid)
    SetParent mWnd, Me.hwnd
    Putfocus mWnd
    LockWindowUpdate False
End Sub
Private Sub Form_Unload(Cancel As Integer)
    ;DestroyWindow mWnd
End Sub

Ответить

Номер ответа: 2
Автор ответа:
 Zahar



Вопросов: 91
Ответов: 67
 Web-сайт: partnerka-ru.info
 Профиль | | #2
Добавлено: 20.08.07 23:32
Хорошо!
Ну а если не известно, где на компьютере находится файл приложения (приложение запускается сразу открытием документа Excel или Word), то как мне в таком случае сделать, чтобы оно открывалось в заданной форме

Ответить

Номер ответа: 3
Автор ответа:
 Mr.Smile



ICQ: 427682013 

Вопросов: 14
Ответов: 464
 Профиль | | #3 Добавлено: 21.08.07 00:27
Ну а если не известно, где на компьютере находится файл приложения (приложение запускается сразу открытием документа Excel или Word), то как мне в таком случае сделать, чтобы оно открывалось в заданной форме

Если я тебя правильно понял, то ты хочешь узнать где находится приложение Word или Excel?

Ответить

Номер ответа: 4
Автор ответа:
 Zahar



Вопросов: 91
Ответов: 67
 Web-сайт: partnerka-ru.info
 Профиль | | #4
Добавлено: 21.08.07 21:52
ДА!!!
(Я же говорил, что я несмышленыш.)

Ответить

Номер ответа: 5
Автор ответа:
 Mr.Smile



ICQ: 427682013 

Вопросов: 14
Ответов: 464
 Профиль | | #5 Добавлено: 21.08.07 23:49
Надеюсь, ты знаешь что такое реестр, и как с ним обращаться.
Вот, например, как узнать путь к Word'у (из Office 2003):
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\11.0\Word\InstallRoot". В этом разделе находится запись Path, которая имеет значение, например "С:\Program Files\Microsoft Office\OFFICE11\". Имя exe-файла (тобишь Word'а) "WINWORD.EXE". Теперь всё соединяешь и получается: "C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE" Это и будет именем файла Word'а. Вот его и запускай.

Ответить

Номер ответа: 6
Автор ответа:
 Mr.Smile



ICQ: 427682013 

Вопросов: 14
Ответов: 464
 Профиль | | #6 Добавлено: 21.08.07 23:51
Ну и намудрил я! :)

Ответить

Номер ответа: 7
Автор ответа:
 Zahar



Вопросов: 91
Ответов: 67
 Web-сайт: partnerka-ru.info
 Профиль | | #7
Добавлено: 22.08.07 13:31
Всё сделал. Но почему-то с Notepad этот код работает, а с Excel и Word окна программы открывюатся отдельно, вне VB-формы.

Ответить

Номер ответа: 8
Автор ответа:
 Mr.Smile



ICQ: 427682013 

Вопросов: 14
Ответов: 464
 Профиль | | #8 Добавлено: 22.08.07 22:23
Всё сделал. Но почему-то с Notepad этот код работает, а с Excel и Word окна программы открывюатся отдельно, вне VB-формы.
Это невозможно. Я сейчас проверил - всё работает. Word внутри программы, как и полагается. Перепроверь код - наверняка в нём ошибка. А если ошибки нет, то попробуй чисто путь указать к Word'у. (C:\Program Files\...\WINWORD.exe)

P.S.: точки, это так... для сокращения.

Ответить

Номер ответа: 9
Автор ответа:
 Zahar



Вопросов: 91
Ответов: 67
 Web-сайт: partnerka-ru.info
 Профиль | | #9
Добавлено: 24.08.07 23:30
Последний (опятьб же глупый) вопрос.
А как обращаться из VB к этому окну. Скажем, как получить данные из одной из ячеек, находящихся внутри длочернего окна Excel.

Ответить

Номер ответа: 10
Автор ответа:
 Millenium



ICQ: 629966 

Вопросов: 118
Ответов: 903
 Web-сайт: www.aliyev.us
 Профиль | | #10
Добавлено: 26.08.07 00:39
Прав он только в том случае (не работает), когда Вёрд 2003 и старше. А на 2002 (ХР), 2000 и меньших братах работает. Самому-тоже интересно. У меня был аналог этого кда, только по короче. Так вот тот тоже (правда на нём я АКСЕСС пробовал) 2003 вылетало извне а 2002-ая становилась дочерной. Наверняка это новые уловки МелкоМягких %).

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам