purebasic.info

PureBasic forum
Текущее время: Ср сен 19, 2018 2:23 pm

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




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
СообщениеДобавлено: Чт апр 28, 2011 11:49 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6382
Благодарил (а): 20 раз.
Поблагодарили: 198 раз.
Пункты репутации: 48
Продолжение на тему управления чужими окнами. Пример с использованием управляющих команд.
В этой API SendMessage_(hwnd, #WM_COMMAND, Command, 0) третий параметр - команда, которую посылает система элементам окна когда мы кликаем по кнопкам или другим органам управления. Программист их не задает сам, но эти команды ( к примеру в отличии от хендла или там PID) не меняются при запуске программы. С их помощью можно взять под полный контроль практически любое приложение. Одно из самых распространенных применений этого метода - управление проигрывателем WINAMP. Я написал код, который управляет калькулятором. Для точности расчетов приведите его к инженерному виду!
Код:
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
 
Global hwndCalc
Calc=RunProgram("calc.exe","","",#PB_Program_Open|#PB_Program_Hide) ;Открываем калькулятор
;Calc = WinExec_("calc.exe", #SW_HIDE ) ; альтернатива на API
Repeat
  hwndCalc=FindWindow_("SciCalc", #Null); Вычисляем хендл калькулятора
    Delay (100)
  x+1
Until hwndCalc>0 Or x>200
If x>200: End:EndIf
 
ShowWindow_(hwndCalc,#SW_HIDE)
 
 ; Копирует в буфер обмена число из калькулятора
Procedure CopyClip()
  hMenu = GetMenu_(hwndCalc)
  nMenuID = GetMenuItemID_(hMenu, 0)
  SendMessage_(nMenuID , #WM_COMMAND,300 , #Null)
EndProcedure
 
; Процедура которая посылает команды на нужные клавиши калькулятора
 Procedure.s SendCOMMAND(Command$)
   ; Все команды вычислены при помощи Microsoft Spy++
  Define Command.i
  Select Command$
    Case "0"
      Command=124
    Case "1"
      Command=125
    Case "2"
      Command=126
    Case "3"
      Command=127
    Case "4"
      Command=128
    Case "5"
      Command=129
    Case "6"
      Command=130
    Case "7"
      Command=131
    Case "8"
      Command=132
    Case "9"
      Command=133
    Case "+"
      Command=92
    Case "-"
      Command=93
    Case "*"
      Command=91
    Case "/","\" ; знак деления любой
      Command=90
    Case "C","c" ; Очистить
      Command=81
    Case ".","," ; разделитель точка или запятая
      Command=85
    Case "("
        Command=122
    Case ")"
        Command=123
    Case "P","p" ; число Pi
        Command=111
    Case "^"       ; это возведение в степень
      Command=95        
    Case "-"
      Command=80        
    Case "="
      Command=112
      SendMessage_(hwndCalc, #WM_COMMAND, Command, 0)
      CopyClip()
      ProcedureReturn GetClipboardText()
     
    Default
      ProcedureReturn ""
  EndSelect
   SendMessage_(hwndCalc, #WM_COMMAND, Command, 0)    
   
 EndProcedure
 
 Procedure.s Calculate(a$)
   For r=1 To Len(a$)
       Resultat$= SendCOMMAND(Mid(a$,r,1))
   Next
If Resultat$
ProcedureReturn Resultat$
EndIf
 
EndProcedure
 
; Проверяем работу
; В строке могут быть любые символы - обрабатываются только валидные
; к примеру можно написать " скока буит 2 + 2 ? ="
; ответ будет правильным и ошибки не возникнет.
; Внимание! Если хотите увидеть ответ, то строка должна ОБЯЗАТЕЛЬНО заканчиватся знаком =
 
Debug Calculate("23*2+11=")
Delay(200)
Calculate("C")
Debug Calculate("23^2+15=")
Calculate("C")
Delay(200)
Debug Calculate("23-(2+15)=")
Delay(200)
Debug Calculate(" скока буит 2 + 2 ? =")
 
; Закрываем калькулятор обязательно ! Он не видим, но в памяти висит.
 
 KillProgram(Calc)
 CloseProgram(Calc)
;PostMessage_(hwndCalc,#WM_CLOSE,0,0)  ; Для сторонников API
 


_________________
read-only


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


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

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