Замечание к документу "Конечно, конечно. Но это "не решение" меня устраивает, а Вы найдите РЕШЕНИЕ - и поделитесь, не сочтите за труд."   >>>   
Тема: В принципе, вроде нашел решение... :)))

Создан:Du ChAN 08/30/2002 08:42 AM
Папка:
03. Русские буквы и Notes, 04. Специфичное "русскому" Lotus Notes, 06. Разработка Notes-приложений
Тип сообщения:
Решение

Сообщение:
исходя из того что Windows это оконная ОС (масло-масленное), я нашел способ как определить открыт ли файл в другом окне...
принцип:
1.получаем список всех окон
2.ищем в заголовках окна название нашего файла
и если есть такое то файл редактируется(открыт)....
есть несколько НО - 1.не все приложения в заголовок выводят имя файла, напримел IE (но насколько я посмотрел-поэкпкрементировал все попавшиеся мне редакторы это делают); 2. необходимо ждать пока приложение откроется и откроет переданный нами файл (но здесь проше чем со способом проверки открытием файла, можно в таймауте секунд 15 поставить ежесекндную проверку на нахождения окна); 3.необходимо чтобы Ваше приложение не выводило ни в какие окна (в том числе и дочернии-диалоговые) в заголовок имя файла (иначе нахождение не вашего окна усложнится!!!); 4.в приложении редакторе может быть несколько окон в заголовках которых присутствует имя вашего файла (дочерние окна, MDI-интерфейс) и не всегда родительское окно (даже если поночалу в нем и есть имя файла(пример MDI)) будет идентифицировать сам файл (так что hWnd хранить нельзя а надо постоянно выбирать список окон или хранить все hWnd и проверять их на заголовок).
Вот... вроде текстовая часть описания закончена...
Теперь пример:
(это пример вывода ВСЕХ окон, для заточки под конкретные применения его придется править. Пример показывает только сам принцип работы с окнами...)
(сам принцип был взят с сайта: http://www.vbnet.ru/
исходный пример: http://www.vbnet.ru/faq/showtopic.asp?id=140)
это код кнопки на форме
на форме так же присутствует поле "WindowList"

Private Const mcGWCHILD = 5
Private Const mcGWHWNDNEXT = 2
Private Const mcGWLSTYLE = (-16)
Private Const mcWSVISIBLE = &H10000000
Private Const mconMAXLEN = 255

Declare Function apiGetClassName Lib "user32" Alias "GetClassNameA" (Byval Hwnd As Long, Byval lpClassname As String, Byval nMaxCount As Long) As Long
Declare Function apiGetDesktopWindow Lib "user32" Alias "GetDesktopWindow" () As Long
Declare Function apiGetWindow Lib "user32" Alias "GetWindow" (Byval Hwnd As Long, Byval wCmd As Long) As Long
Declare Function apiGetWindowLong Lib "user32" Alias "GetWindowLongA" (Byval Hwnd As Long, Byval nIndex As Long) As Long
Declare Function apiGetWindowText Lib "user32" Alias "GetWindowTextA" (Byval Hwnd As Long, Byval lpString As String, Byval aint As Long) As Long

Dim ws As notesUIWorkspace
Dim note As notesUIDocument

Sub Click(Source As Button)
Set ws = New notesUIWorkspace
Set note = ws.CurrentDocument

Call note.FieldSetText("WindowList", "")

Call fEnumWindows(apiGetDesktopWindow(), 0)
End Sub

Function fEnumWindows(Plngx As Long, Ur As Integer)
Dim lngx As Long, lngLen As Long
Dim lngStyle As Long, strCaption As String

'Return the first child to Desktop
lngx = apiGetWindow(Plngx, mcGWCHILD)
Do While Not lngx = 0
strCaption = fGetCaption(lngx)
If Len(strCaption) > 0 Then
lngStyle = apiGetWindowLong(lngx, mcGWLSTYLE)
'enum visible windows only
If lngStyle And mcWSVISIBLE Then
AddWin$ = String(Ur, "-")+"Class = " & fGetClassName(lngx) & " - Caption = " & fGetCaption(lngx)
OldList$ = note.FieldGetText("WindowList")
Call note.FieldSetText("WindowList",OldList$+Chr$(10)+AddWin$)
End If
End If
Call fEnumWindows(lngx, Ur+1)
lngx = apiGetWindow(lngx, mcGWHWNDNEXT)
Loop
End Function

Function fGetCaption(Hwnd As Long)
Dim strBuffer As String
Dim intCount As Integer
strBuffer = String$(mconMAXLEN - 1, 0)
intCount = apiGetWindowText(Hwnd, strBuffer, mconMAXLEN)
If intCount > 0 Then
fGetCaption = Left$(strBuffer, intCount)
End If
End Function

Function fGetClassName(Hwnd As Long)
Dim strBuffer As String
Dim intCount As Integer
strBuffer = String$(mconMAXLEN - 1, 0)
intCount = apiGetClassName(Hwnd, strBuffer, mconMAXLEN)
If intCount > 0 Then
fGetClassName = Left$(strBuffer, intCount)
End If
End Function


Иерархия документов данной дискуссии:
редактирование вложений на месте (gora 6019) (12.08.2002 12:05:50)
.... пардон, только под 5.ххх (gora 6019) (12.08.2002 12:24:33)
........ Обсуждалось здесь (+) (Grigory A. Brumberg; NotesSrv400) (12.08.2002 15:18:07)
............ Что значит почти... у нас работает... =))) (Vladimir O. Troyanovskiy; Nord) (13.08.2002 8:32:19)
................ если не секрет - что именно работает и возможно ли и как посмотреть ? (gora gora) (13.08.2002 12:08:46)
.................... Непосредственно из тела сообщения жмешь на кнопку, далее запускается приложения , делаешь изменения , сохраняешь , и сохраненная копия сама вставляется обратно в тело письма. (Vladimir O. Troyanovskiy; Nord) (13.08.2002 15:06:24)
........................ Приложение может быть любое - или строго ограниченный список? Т.е. код кнопки универсален - или строго заточен под какие-то приложения? (Ivan Tsibanenko; MoscowHub) (13.08.2002 16:21:18)
............................ Normal;Ну естественно не любые.. COM объекты... (Vladimir O. Troyanovskiy; Nord) (14.08.2002 12:30:31)
................................ Ясно. А у меня любые открываются. Проверка для загрузки изменённого файла обратно - по NotesTimer пытается открыть файл монопольно. Как только получается, проверяет размер и дату последних изменений файла, и, если они изменились, подгружает файл обратно в Notes. (Ivan Tsibanenko; MoscowHub) (14.08.2002 14:34:02)
.................................... ну..... крут =))) (Vladimir O. Troyanovskiy; Nord) (15.08.2002 14:58:35)
.................................... можно ли попробовать ? потому что почти всегда "всплывают" не очевидные на первый взгляд ограничения, которые могут оказаться решающими. (gora gora) (19.08.2002 8:45:10)
.................................... Иван, ... (Gleb Nozdrachev) (20.08.2002 9:50:09)
........................................ А правильно ли возвращается время модификации или нет - в этом случае без разницы. (Ivan Tsibanenko; MoscowHub) (20.08.2002 10:14:01)
............................................ Я, видимо, неточно выразился (+) (Gleb Nozdrachev) (20.08.2002 11:01:38)
................................................ Есть, есть такая вероятность. :-) (Ivan Tsibanenko; MoscowHub) (20.08.2002 11:51:41)
............................................ про длину в 0.... (Du ChAN) (28.08.2002 5:32:34)
................................................ Пока спасаюсь 2-х секундной задержкой после запуска и такой же, после того как будет отловлено состояние, что файл свободен. Но мне всё это сильно не нравится... :-\ А пока ничего лучше придумать не смог. :-( (Ivan Tsibanenko; MoscowHub) (28.08.2002 9:41:40)
.................................................... кстати не все приложения блокируют доступ к редактируемому файлу... :((( (Du ChAN) (29.08.2002 12:07:08)
.................................... Помогите, а как определить дату редакции файла на диске? (Stas A) (26.03.2008 17:11:12)
........................ можно ли попробовать ? потому что почти всегда "всплывают" не очевидные на первый взгляд ограничения, которые могут оказаться решающими. (gora gora) (19.08.2002 8:44:10)
............ про 6-ку - понятно, речь про 5-ку - есть ли контакты ссылки линки ? (gora gora) (13.08.2002 12:07:00)
................ Например (+) (Vitaliy A Bourchenkov) (13.08.2002 12:09:46)
.................... большое спасибо. я, наверное, недостаточно ярко выделил в теме и категории свое начального сообщения слово РУССКИЙ ЯЗЫК. англоговорящие не могут себе представить, что кто-то может использовать др... (gora gora) (13.08.2002 13:11:31)
.... Было в SandBox.... + мои наработки..... (Du ChAN) (19.08.2002 7:51:17)
........ огромное спасибо. я действительно считаю не кокетством фразу "и так раззорился" очень ценю стремление попочь. но... (gora gora) (19.08.2002 8:51:36)
............ Насчет того "немца из песочницы"... (Gleb Nozdrachev) (20.08.2002 9:46:55)
................ спасибо, это мне действительно важно. (gora gora) (20.08.2002 13:40:21)
................ Вообще-то от того "немца" там идея и пара функций.... (Du ChAN) (21.08.2002 5:13:50)
.................... Ну что же... (Gleb Nozdrachev) (21.08.2002 12:12:30)
........................ Н-да... касяк.... (Du ChAN) (22.08.2002 7:32:58)
............................ Никакой это не "косяк". (Gleb Nozdrachev) (22.08.2002 8:03:14)
................................ Правильно ли я понимаю, что ты пытаешься продать одно единственное Know How? (номер статьи в MSDN, например) (Ivan Tsibanenko; MoscowHub) (22.08.2002 9:41:15)
.................................... Нет, неправильно (+) (Gleb Nozdrachev) (22.08.2002 11:48:02)
........................................ Да, всё в порядке. Посмотри пожалуйста или хотя бы напомни ключевое слово, по которому можно найти статью в MSDN. (Ivan Tsibanenko; MoscowHub) (22.08.2002 13:09:57)
............................................ http://support.microsoft.com/default.aspx?scid=kb;en-us;q210565 (Gleb Nozdrachev) (22.08.2002 13:54:56)
................................................ Спасибо! :-) (Ivan Tsibanenko; MoscowHub) (22.08.2002 14:45:14)
................................ на самом деле это не решение..... :((( (Du ChAN) (23.08.2002 5:47:02)
.................................... Конечно, конечно. Но это "не решение" меня устраивает, а Вы найдите РЕШЕНИЕ - и поделитесь, не сочтите за труд. (Gleb Nozdrachev) (23.08.2002 8:25:27)
........................................ Если я правильно понял вопрос (а это вряд ли :-), то (+) (Vitaliy A Bourchenkov) (23.08.2002 12:16:19)
............................................ А зачем для OLE DLL?.... (Du ChAN) (27.08.2002 6:06:51)
................................................ Конечно, можно и так. Просто, ИМХО, с момощью Delphi это проще будет - компонента там могучая (-) (Vitaliy A Bourchenkov) (27.08.2002 8:18:18)
.................................................... нет не проще, поскольку требует в дальнейшем установки дополнительных модулей на каждое рабочее место... (Du ChAN) (27.08.2002 11:30:45)
........................................ В принципе, вроде нашел решение... :))) (Du ChAN) (30.08.2002 8:42:02)
............................................ Да ! Сильно :) у меня оно всю винду как ппатологоанатом препарировала - все окошки показала - даже которые как бы не приложения а просто элементы... Может есть вариант показывать только названия окошков приложений ? (Илья В Крачковский; Designsrv) (30.08.2002 10:13:51)
................................................ Все правильно: кнопки это тоже такие маленькие окошки... :)))) (Du ChAN) (02.09.2002 7:00:04)
........................ на том же SandBox'e нашел..... (Du ChAN) (22.08.2002 7:56:57)
............................ огромное спасибо. кстати, может это будет интересно для СНС ? соседи толканите... (gora gora) (26.08.2002 13:08:06)
........ кстати, немец этот из песочницы - сделал-таки работоспособную версию. на бывшей нотес411 положил. (gora gora) (19.08.2002 14:24:30)
........ Спасибо! (Rahman Nur) (09.10.2003 7:53:48)


Разработчикам и администраторам: курсы, книги, сертификация