Страница: 1 | 2 |
Вопрос: Активация окна через API
Добавлено: 27.10.06 22:17
Автор вопроса: Arseny | ICQ: 298826769
Суть: Из своей программы я запускаю другую свою. Если она запущена, я ее закрываю. Это все ясно. А если программа свернута - то развернуть? А если программа на втором плане, как ее выдвинуть на первый? Гет ми функции плиз?
Ответы
Всего ответов: 22
Номер ответа: 1
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #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-сайт:
Профиль | | #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-сайт:
Профиль | | #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-сайт:
Профиль | | #7
Добавлено: 29.10.06 13:01
хахаха А я привык получать чёткий вопрос и чёткий ответ на него.
Для того способа, что я описал, должно существовать окно. Оно будет получать сообщения и их обрабатывать. Откуда по-твоему вызовется код FormName.Show??? Из функции окна (надеюсь в курсе что это, а то васик от таких вещей отучает). Чтобы не тратить лишнюю память оч удобно не создавать доп диалог в ресурсах, а создать апишкой. Тем более гораздо проще задать в таком случае функцию окна и класс окна. Вот почему я говорю про CreateWindowExA
Номер ответа: 8
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #8
Добавлено: 29.10.06 19:26
Нет я понял о чем, в принципе верно, если первая своя просто запускает другую прогу, целесобразно создавать окно первой через CreateWindowExA, но в вопросе такого условия небыло... т.е. логично что какое-то окно уже есть...
Номер ответа: 9
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #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-сайт:
Профиль | | #11
Добавлено: 30.10.06 11:41
2LamerOnLine, да, заметил. Всё дело в:
1) Плохо поставленный вопрос вызывает много разных ответов
2) Я пытался показать универсальный метод, наиболее правильный. Но здесь все довольствуются самопальным двух-колёсным средством передвижения. И говорят, что я не прав Это вытекает из первого - неправильно поставленного вопроса. Вот хакер уже телепат, мне пока не дано
Номер ответа: 12
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #12
Добавлено: 30.10.06 19:45
Блин, ок, запостим и твой универсальный
'********************************************************************
'* Написано 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 "efWindowProcA" (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-сайт:
Профиль | | #14
Добавлено: 30.10.06 22:08
Arseny
Программирование, это не простая тема. Прошли времена простых программ. Хочешь мощного функционала, придётся много писать. На С++ на самом деле всё проще пишется в разы. В смысле объёма кода.
{
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 (чего выше в примере на си нет)
выходят одни яйца (В смысле объёма кода.)