purebasic.info

PureBasic forum
Текущее время: Ср дек 12, 2018 3:57 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
СообщениеДобавлено: Ср май 30, 2018 6:04 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 239
Благодарил (а): 22 раз.
Поблагодарили: 33 раз.
Пункты репутации: 0
В общем вопрос в заголовке.
поискал например это и это
В первом компилятор ругается на отсутствие IsFunction
Во втором сам скрипт не запускается но соорудив тестовый пример он мне выдал кракозябры, видимо получив путь в ANSI

я немного прокомментировал, мне здесь нравится как я делал раньше исключение окон на видимые и т.д.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#PROCESS_ALL_ACCESS=$01F0FFF
#MAX_PATH=$0104
 
Procedure.s GetExePath(hWnd.l)
        pid.l=0
        GetWindowThreadProcessId_( hWnd, @pid )
        hProcess.l = OpenProcess_( #PROCESS_ALL_ACCESS, 0, pid );
        Name.s=Space(256)
       
        If OpenLibrary(0,"PSAPI.DLL")
                *F=IsFunction(0,"GetModuleFileNameExA")
                If *F
                        CallFunctionFast(*F,hProcess,0,@Name,#MAX_PATH )
                Else
                        Debug "Функция не найдена"
                        CloseLibrary(0)
                        End
                EndIf
        Else
                Debug "Библиотека не открыта"
                End
        EndIf
        ProcedureReturn Name
EndProcedure
 
Procedure FindWindowExeName()
       
        hWnd.l = FindWindow_( 0, 0 ) ; получить все дочерние окна рабочего стола
       
        While hWnd <> 0 ; перечисляем окна, у которых дескриптор окна не равен 0
                If GetWindowLong_(hWnd, #GWL_STYLE) & #WS_VISIBLE = #WS_VISIBLE ; если в стилях окна присутствует флаг "видимые"
                        If GetWindowLong_(hWnd, #GWL_EXSTYLE) & #WS_EX_TOOLWINDOW <> #WS_EX_TOOLWINDOW ; если в стилях окна не присутствует флаг "окно инструмента"
                                txt.s = Space(256)                                                                                                                 ; создаём переменную длинной в максимаьный путь
                                GetWindowText_(hWnd,@txt,256)                                                                                      ; вставляем в переменную заголовок окна
                               
                                If txt <> "" ; если заголовок не пустой, то
                                       
                                        Debug txt +" - " + GetExePath(hWnd) ; выводим пути
                                       
                                EndIf
                        EndIf
                EndIf
                hWnd = GetWindow_(hWnd, #GW_HWNDNEXT) ; перейти к следующему окну для его обработки
        Wend
EndProcedure
 
FindWindowExeName()



второй с кракозябрами
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
NewList WindExp.s()
 
Procedure.s FilePath(pid)
        processname$ = ""
        hprocess = OpenProcess_(#PROCESS_ALL_ACCESS,#Null,pid)
        If hprocess
                psapilib=OpenLibrary(#PB_Any,"psapi.dll") ; не забыть закрыть CloseLibrary
                If psapilib
;                       processname$=Space(#MAX_PATH)
;                       GetModuleFileNameEx=CallFunction(PSapiID, "GetModuleFileNameExA", hprocess, #Null, @processname$, #MAX_PATH)
                        GetModuleFileNameEx=GetFunction(psapilib,"GetModuleFileNameExA")
                        If psapilib
                                processname$=Space(#MAX_PATH)
                                CallFunctionFast(GetModuleFileNameEx, hprocess, #Null, @processname$, #MAX_PATH)
                        EndIf
                EndIf
        EndIf
        ProcedureReturn processname$
EndProcedure
 
Procedure.l EnumProcedure(hWnd, Parameter)
        Protected processname$ = ""
        Shared WindExp.s()
        If IsWindow_(hWnd)
                GetWindowThreadProcessId_(hWnd,@PID)
                processname$ = FilePath(PID)
                Debug processname$
                If  Len(processname$) And RSet(processname$ , 13) = "\explorer.exe"
                        hToolbarWindow32=FindWindowEx_(hWnd,0,"ToolbarWindow32",0) ; найти дескриптор элемента поля адресной строки
                        hhToolbarWindow32_3 = GetDlgItem_(hToolbarWindow32, 3)
                        pText.s = Space(256)
                        SendMessage_(hhToolbarWindow32_3, #WM_GETTEXT, 256, @pText)
                        MessageRequester("Сообщение", pText.s)
                        AddElement(WindExp()) : WindExp() = pText.s
                EndIf
        EndIf
        ProcedureReturn 1
EndProcedure
 
 
EnumWindows_(@EnumProcedure(), 0)



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср май 30, 2018 6:32 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Ср июн 18, 2014 6:34 pm
Сообщений: 111
Благодарил (а): 3 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
удалено


Последний раз редактировалось Дегтярёв Ср май 30, 2018 6:46 pm, всего редактировалось 3 раз(а).

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср май 30, 2018 6:42 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 239
Благодарил (а): 22 раз.
Поблагодарили: 33 раз.
Пункты репутации: 0
Дегтярёв писал(а):
Те же самые советы, полистай Друпию, полистай КодАрхив, и не ложь зеркало в парту.
А он ложит и ложит.

Избавь меня от своих советов. Если недоволен, то просто не мешай. зачем своё недовольство продавать за советы?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср май 30, 2018 7:15 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6411
Благодарил (а): 21 раз.
Поблагодарили: 200 раз.
Пункты репутации: 52
Дегтярёв, в друпии отличные примеры, только иногда устаревшие. В новых весиях невозможно отключить поддержку Юникода и приведённый тобой пример выдаст кракозяблы, т.к. там используется ANSI версия функции GetModuleFileNameExA Можно доработать на оба случая Юникод и ANSI :
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
Prototype.l GetModuleFileNameEx(hProcess.l, hModule.l, *lpFilename.String, nSize.l)
Global  GetModuleFileNameEx.GetModuleFileNameEx
ProcedureDLL.s PidToFileName(PID.l)
 If OpenLibrary(0, "Psapi.dll")
   If #PB_Compiler_Unicode
      GetModuleFileNameEx.GetModuleFileNameEx = GetFunction(0, "GetModuleFileNameExW")
   Else
      GetModuleFileNameEx.GetModuleFileNameEx = GetFunction(0, "GetModuleFileNameExA")
   EndIf
EndIf
  hProcess.l = OpenProcess_(#PROCESS_QUERY_INFORMATION | #PROCESS_VM_READ, #False, PID )
  Name.s=Space(256)
  GetModuleFileNameEx(hProcess,0,@Name,#MAX_PATH)
  ProcedureReturn Name
EndProcedure
 


_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн июн 18, 2018 4:19 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 339
Благодарил (а): 1 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
AZJIO писал(а):
второй с кракозябрами

нужно перевести в анси так:эту строчку Debug processname , меняем на Debug PeekS(@processname$,Len(processname$),#PB_Ascii) и после у меня стало по человечески показывать, собственно так: (немного добавил своего кода)
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
NewList WindExp.s()
 
Procedure.s FilePath(pid)
        processname2$ = ""
        hprocess = OpenProcess_(#PROCESS_ALL_ACCESS,#Null,pid)
        If hprocess
                psapilib=OpenLibrary(#PB_Any,"psapi.dll") ; не забыть закрыть CloseLibrary
                If psapilib
 
                        GetModuleFileNameEx=GetFunction(psapilib,"GetModuleFileNameExA")
                        If psapilib
                                processname2$=Space(#MAX_PATH)
                                CallFunctionFast(GetModuleFileNameEx, hprocess, #Null, @processname2$, #MAX_PATH)
                        EndIf
                EndIf
        EndIf
        ProcedureReturn processname2$
EndProcedure
 
Procedure.l EnumProcedure(hWnd, Parameter)
   Protected processname$ = ""
        Shared WindExp.s()
        If IsWindow_(hWnd)
            GetWindowThreadProcessId_(hWnd,@PID)
            Title${200}; Title$= "":            
            GetWindowText_(hWnd, @Title$, 200)
            processname$ = FilePath(PID)
            Debug "PID: "+Str(PID)+"  hWnd: "+Str(hWnd)+"  ' "+Title$+" '"
                 Debug  PeekS(@processname$,Len(processname$),#PB_Ascii)
                Debug ""
                If  Len(processname$) And RSet(processname$ , 13) = "\explorer.exe"
; найти дескриптор элемента поля адресной строки
                        hToolbarWindow32=FindWindowEx_(hWnd,0,"ToolbarWindow32",0)
                        hhToolbarWindow32_3 = GetDlgItem_(hToolbarWindow32, 3)
                        pText.s = Space(256)
                        SendMessage_(hhToolbarWindow32_3, #WM_GETTEXT, 256, @pText)
                        MessageRequester("Сообщение", pText.s)
                        AddElement(WindExp()) : WindExp() = pText.s
                EndIf
        EndIf
        ProcedureReturn 1
EndProcedure
 
 
EnumWindows_(@EnumProcedure(), 0)


У меня недопонятки, что это и как понимть Title${200}; Title$= "": , почему не как обычно,
а в фигурных скобках? (вылетает прога и указыввает на переменную где все ОКей Procedure.s FilePath(pid)
processname2$ = "".
Коечто я кажется понял, это типа строка фиксированой длинны , когда применил
Title$= Space(200)
GetWindowText_(hWnd, @Title$, 200) то все работает без проблем.

И еще, гдето похоже встречал в квадратных скобках похоже на Tit[8], как это работает все.

_________________
искатель истины


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Bing [Bot] и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB