Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 | 2 |

 

  Вопрос: Активация окна через API Добавлено: 27.10.06 22:17  

Автор вопроса:  Arseny | ICQ: 298826769 
Суть: Из своей программы я запускаю другую свою. Если она запущена, я ее закрываю. Это все ясно. А если программа свернута - то развернуть? А если программа на втором плане, как ее выдвинуть на первый? Гет ми функции плиз?

Ответить

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

Номер ответа: 1
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #1
Добавлено: 28.10.06 00:31
посылай программе своей сообщения. причём свои. То есть например код сообщения разворачивания будет как WM_USER + 1. Для вывода на первый план WM_USER + 2
Только придумай, как ты будешь находить хэндл своего окна. Для удобства можно CreateWindowExA. И задать свою функцию окна. И там всё обрабатывать. Окну спец класс дать и дальше находить через FindWindowExA

Ответить

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


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #2 Добавлено: 28.10.06 01:06
2 Ra$cal Слегка непонял ход твоих мыслей... вопрос:
Как развернуть? и Как на передний план?

Тут один вариант ответа:
API ShowWindow. Возможно для поиска окна ещё FindWidnow пригодится... Зачем посылать свои сообщение окну, соответственно обрабатывать их... х.з.. :)

Ответить

Номер ответа: 3
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #3
Добавлено: 28.10.06 13:59
ну расскажи, какой апи показать окно, которое не создано? Именно так должно быть с треем. Окно не должно существовать после закрытия и до открытия. Вообще я после исследования такой механизм видел в XFilesDialog и HyperSnap. Ибо это даёт очень много возможностей управлять программой.

Ответить

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



ICQ: 298826769 

Вопросов: 53
Ответов: 1732
 Профиль | | #4 Добавлено: 28.10.06 16:09
2 Ra$cal:
какой апи показать окно, которое не создано

Ну почему не создано? Я же в своей проге уже вычислил, есть оно или нет.

2 HACKER:
Благодарю! С меня пиво. (Если в Харькове буду) :)))

Ответить

Номер ответа: 5
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #5
Добавлено: 28.10.06 17:42
Тогда уточняй, что все окна твои висят в памяти и не уничтожаются. А то по-правильному всё же убивать неиспользуемые окошки

Ответить

Номер ответа: 6
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #6 Добавлено: 29.10.06 00:30
2 Ra$cal, за долгое время тусования на этом форуме, я приобрел телепатические качества :))))

А вообще, если окно не существет (выгружено), то логично чтобы его показать (развернуть), или переместить на передний план - окно нужно показать (создать)... Опять таки зачем тут CreateWindowExA х.з... а вот FormName.Show рулит :)

Ответить

Номер ответа: 7
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #7
Добавлено: 29.10.06 13:01
за долгое время тусования на этом форуме, я приобрел телепатические качества :))))

хахаха :) А я привык получать чёткий вопрос и чёткий ответ на него.

Опять таки зачем тут CreateWindowExA х.з

Для того способа, что я описал, должно существовать окно. Оно будет получать сообщения и их обрабатывать. Откуда по-твоему вызовется код FormName.Show??? Из функции окна (надеюсь в курсе что это, а то васик от таких вещей отучает). Чтобы не тратить лишнюю память оч удобно не создавать доп диалог в ресурсах, а создать апишкой. Тем более гораздо проще задать в таком случае функцию окна и класс окна. Вот почему я говорю про CreateWindowExA

Ответить

Номер ответа: 8
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #8 Добавлено: 29.10.06 19:26
Нет я понял о чем, в принципе верно, если первая своя просто запускает другую прогу, целесобразно создавать окно первой через CreateWindowExA, но в вопросе такого условия небыло... т.е. логично что какое-то окно уже есть...

Ответить

Номер ответа: 9
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #9
Добавлено: 29.10.06 19:54
Ну я ж не телепат ;) Я советовал универсальный способ. Чтоб не только окно существующее вывести на передний план, но и что душе заблагорассудится.
Всё, заканчиваем флуд.

Ответить

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



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #10 Добавлено: 30.10.06 10:49
Всё, заканчиваем флуд.

2Ra$cal, не в обиду, не все темы с твоим участием подобными постами кончаются. К чему бы это :))

Ответить

Номер ответа: 11
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #11
Добавлено: 30.10.06 11:41
2LamerOnLine, да, заметил. Всё дело в:
1) Плохо поставленный вопрос вызывает много разных ответов
2) Я пытался показать универсальный метод, наиболее правильный. Но здесь все довольствуются самопальным двух-колёсным средством передвижения. И говорят, что я не прав :) Это вытекает из первого - неправильно поставленного вопроса. Вот хакер уже телепат, мне пока не дано :)

Ответить

Номер ответа: 12
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #12 Добавлено: 30.10.06 19:45
Блин, ок, запостим и твой универсальный :)

Option Explicit

'********************************************************************
'*            Написано 16.03.2004 году (Team HomeWork)              *
'*                   e-mail: sne_pro@mail.ru                        *
'********************************************************************
'*                                                                  *
'*  Иногда случается так, что необходимо перехватыввать сообщения   *
'*     которые должны отправляться окну, а окна (формы) - нет.      *
'*        Так что мы делаем, правильно создаем свое окно ;)         *
'*                                                                  *
'********************************************************************

Private Declare Function RegisterClass Lib "user32" Alias "RegisterClassA" (Class As WNDCLASS) As Long
Private Declare Function UnregisterClass Lib "user32" Alias "UnregisterClassA" (ByVal lpClassName As String, ByVal hInstance As Long) As Long

Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
Private Declare Function DestroyWindow Lib "user32.dll" (ByVal hWnd As Long) As Long

Private Declare Function DefWindowProc Lib "user32" Alias ";DefWindowProcA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Type WNDCLASS
    Style           As Long
    lpfnWndProc     As Long
    cbClsExtra      As Long
    cbWndExtra2     As Long
    hInstance       As Long
    hicon           As Long
    hCursor         As Long
    hbrBackground   As Long
    lpszMenuName    As String
    lpszClassName   As String
End Type
Private Type gbHWWndReceiver
    sClassName      As String
    lngHandle       As Long
    lpCBFunction    As Long
End Type

Private WndR() As gbHWWndReceiver

Public Sub CreateWndReceiver(ByVal sClassName As String, ByVal lCodePtr As Long)
    Dim fi As Long                                          ' Проверка на существование посылки сообщений процедуре
    For fi = 0 To UBoundWndR
        If WndR(fi).lpCBFunction = lCodePtr Then Exit Sub
    Next
    
    Dim WndCls As WNDCLASS                                  ' Регистрация нового класса в системе
    With WndCls
        .lpfnWndProc = CodePtr(AddressOf WndReceiverProc)
        .hInstance = App.hInstance
        .lpszClassName = sClassName
    End With
    Call RegisterClass(WndCls)

    ReDim Preserve WndR(UBoundWndR + vbNull)                ' Создание окна
    With WndR(UBoundWndR)
        .lpCBFunction = lCodePtr
        .sClassName = sClassName

        .lngHandle = CreateWindowEx(0&, .sClassName, "WndResiver_" & sClassName & "_CopyRight (c) HomeWork", 0&, 0&, 0&, 0&, 0&, 0&, 0&, App.hInstance, ByVal 0&;)
    End With
End Sub

Public Sub DestroyWnd(ByVal lCodePtr As Long)
    Dim WndID As Long, fi As Long
        WndID = &HFFFF

    For fi = 0 To UBoundWndR                                        ' Находим нужный нам элемент
        If WndR(fi).lpCBFunction = lCodePtr Then WndID = fi: Exit For
    Next

    If WndID = &HFFFF Then Exit Sub

    Call DestroyWindow(WndR(WndID).lngHandle)                       ' Не заываем уничтожить окно
    Call UnregisterClass(WndR(WndID).sClassName, App.hInstance)

    fi = UBoundWndR                                                 ' Удаляем эллемент
    If Not fi = 0 And Not fi = &HFFFF Then
        If Not fi = WndID Then Call CopyMemory(WndR(WndID), WndR(WndID + vbNull), Len(WndR(WndID)) * (fi - WndID))
        ReDim Preserve WndR(fi - vbNull)
    Else
        Erase WndR
    End If
End Sub

Public Function GetHandle(ByVal lCodePtr As Long) As Long
    Dim WndID As Long, fi As Long
        WndID = &HFFFF

    For fi = 0 To UBoundWndR
        If WndR(fi).lpCBFunction = lCodePtr Then GetHandle = WndR(fi).lngHandle: Exit For
    Next
End Function

' §§§§§§§§§§§§§§§§§§§§§§§§§§  §§§§§§§§§§§§§§§§§§§§§§§§§§

Private Function WndReceiverProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim WndID As Long, fi As Long
        WndID = &HFFFF

    For fi = 0 To UBoundWndR
        If WndR(fi).lngHandle = hWnd Then WndID = fi
    Next

    If Not WndID = &HFFFF Then                              ' Отсылаем данные нужной нам процедуре
        Call CallWindowProc(WndR(WndID).lpCBFunction, hWnd, uMsg, wParam, lParam)
    End If

    WndReceiverProc = DefWindowProc(hWnd, uMsg, wParam, lParam)
End Function

' §§§§§§§§§§§§§§§§§§§§§§§§§§ Вспомогательное добро §§§§§§§§§§§§§§§§§§§§§§§§§§

Private Function CodePtr(ByVal lpfn As Long) As Long
    CodePtr = lpfn
End Function

Private Function UBoundWndR() As Long
    On Error Resume Next
    UBoundWndR = &HFFFF: UBoundWndR = UBound(WndR)
End Function

Ответить

Номер ответа: 13
Автор ответа:
 Arseny



ICQ: 298826769 

Вопросов: 53
Ответов: 1732
 Профиль | | #13 Добавлено: 30.10.06 21:29
Т-твою мазер.... Я вроде более-менее простой вопрос задал.... :))))

Ответить

Номер ответа: 14
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #14
Добавлено: 30.10.06 22:08
Arseny
Программирование, это не простая тема. Прошли времена простых программ. Хочешь мощного функционала, придётся много писать. На С++ на самом деле всё проще пишется в разы. В смысле объёма кода.

void CreateMainWindow()
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof ( WNDCLASSEX );

wcex.style = 0;
wcex.lpfnWndProc = ( WNDPROC ) WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = 0;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = 0;
wcex.lpszClassName = PROGRAM_NAME;
wcex.hIconSm = 0;

RegisterClassEx(&wcex);

    hWnd = CreateWindow(PROGRAM_NAME, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
}

// Окошко, которое всегда в системе и получает все сообщения
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_USER+1:
DialogBox (hInst, (LPCSTR)IDD_SETTINGS, ::hWND,(DLGPROC) DLG_Settings);

default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}

Ответить

Номер ответа: 15
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #15 Добавлено: 31.10.06 21:18
минус декларации
минус операцие структур
минус вспомогательные CodePtr, UBoundWndR
+ Destroy (чего выше в примере на си нет)

выходят одни яйца :) (В смысле объёма кода.)

:)

Ответить

Страница: 1 | 2 |

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



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