PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Послать стринг (или символы с клавиатуры) из программы в чужое окно


Послать стринг (или символы с клавиатуры) из программы в чужое окно

Сообщений 1 страница 8 из 8

1

Следующая проблема: необходимо послать String (или последовательность символов с клавиатуры) из одной, написанной на РВ (активной) программы
в окно другой (неактивной, чужой) программы.
Основной вопрос :  где и как искать имя окна чужой программы ?
Как получить список окон чтобы выбрать нужное окно ?

К сожалению не могу понять за что зацепиться.
Использование "третьей" программы типа AutoIt нежелательно.

Может кто помочь ?

Заранее благодарю

Александр

P.S. К сожалению все примеры на РВ от 2003-2005 гг. устарели.

Отредактировано alex112 (04.06.2024 13:01:08)

0

2

alex112 написал(а):

где и как искать имя окна чужой программы ?

WinGetHandle()

alex112 написал(а):

необходимо послать String

SendKey или вытащить рабочий код с использованием SendKey отсюда
Возможно WM_PASTE

Код:
SendMessage_(hwnd, #WM_PASTE, 0, 0)

Отредактировано AZJIO (04.06.2024 15:53:22)

0

3

Я использовал для отправки строк и нажатия клавиш в окне другой программы процедуру SendKeys(handle,window$,keys$), найденную по ссылке:

https://www.purebasic.fr/english/viewtopic.php?t=3766
SendKeys procedure by PB -- do whatever you want with it.  :)
Syntax: r=SendKeys(handle,window$,keys$) ; r = 0 for failure.
Specify either a handle or window$ title to type to, but not both!
You cannot type curly braces { } as part of the keystrokes, sorry!

Эта процедура принимает параметрами или имя чужого окна, или его дескриптор (handle).
Практика показала, что удобнее иногда бывает отправлять строки в чужое окно по его дескриптору (handle), а не по имени окна, которые могут быть одинаковыми у разных открытых окон.

А теперь к ответу на заданный здесь вопрос о списке окон чужих программ.
Список открытых окон, видимых и скрытых, с их именами и дескрипторами (handle) я заполнял процедурой GetAllWindows(), которую увидел в книге "Программирование в PureBasic глазами хакера": "Глава 3. Система, п. 3.1. Работа с чужими окнами", и немного изменил для удобства.

Код:
Procedure GetAllWindows(hWnd, lparam) 
  name.s = Space(100) ; Резервируем  под название окна 100 символов
  GetWindowText_(hWnd, @name, 100) 
  IsWindowVisible0.l=IsWindowVisible_(hWnd)
  If IsWindowVisible0
    AddElement(WndList1())
    WndList1()\hWnd = hWnd
    WndList1()\isHidden = IsWindowVisible0
    WndList1()\NameWnd = name
  Else
    AddElement(WndList2())
    WndList2()\hWnd = hWnd
    WndList2()\isHidden = IsWindowVisible0
    WndList2()\NameWnd = name
  EndIf 
  ProcedureReturn #True 
EndProcedure 

Эту процедуру GetAllWindows() я вызывал из исходной процедуры WindowsList(), сохраняющей список открытых окон в текстовый файл, командой EnumWindows_(@GetAllWindows(), 0)

Процедура GetAllWindows(hWnd, lparam) заполняет два отдельных списка - для видимых и для скрытых окон, которые я потом сортирую по имени окна и записываю оба эти списка в один текстовый файл.

Итак, сначала я объявляю в программе структуру для сохранения списка окон и создаю два списка с типом этой структуры:

Код:
Structure WindowListInfo
  hWnd.l
  NameWnd.s
  isHidden.l
EndStructure
Global NewList WndList1.WindowListInfo()
Global NewList WndList2.WindowListInfo()

А затем в процедуре WindowsList():

Код:
  ;Заполнить списки данными открытых видимых и скрытых окон
  EnumWindows_(@GetAllWindows(), 0)

  ;Отсортировать списки по именам окон (просто для удобства поиска нужного окна в текстовом файле)
  SortStructuredList(WndList1(), #PB_Sort_Ascending, OffsetOf(WindowListInfo\hWnd), TypeOf(WindowListInfo\hWnd))
  SortStructuredList(WndList1(), #PB_Sort_Ascending|#PB_Sort_NoCase, OffsetOf(WindowListInfo\NameWnd), TypeOf(WindowListInfo\NameWnd))
  SortStructuredList(WndList2(), #PB_Sort_Ascending, OffsetOf(WindowListInfo\hWnd), TypeOf(WindowListInfo\hWnd))
  SortStructuredList(WndList2(), #PB_Sort_Ascending|#PB_Sort_NoCase, OffsetOf(WindowListInfo\NameWnd), TypeOf(WindowListInfo\NameWnd))
  
  ;записать списки в текстовую переменную и сохранить ее в файл
  sList1.s=""
  ForEach WndList1()
    sList1=sList1+StrU(WndList1()\hWnd)+Chr(9)+WndList1()\NameWnd+#LFCR$
  Next
  sList2.s=""
  ForEach WndList2()
    sList2=sList2+StrU(WndList2()\hWnd)+Chr(9)+WndList2()\NameWnd+#LFCR$
  Next

Ну, а затем я просто сохраняю эти две текстовые переменные в один текстовый файл с полным списком открытых окон: сначала видимых, а затем скрытых окон, и открываю этот файл для просмотра.

Отредактировано Nemo3001 (16.06.2024 12:41:03)

0

4

Был похожий тред на  пропавшем форуме. Некто намекнул, что SendKeys сработает не на всех вендах и посоветовал использовать keybd_event

0

5

egons
Пока попробовал на windows 7, 10 и 11, работает. Использую эти процедуры в разных программах, где нужно управлять работой окон других программ - в браузерах, или в других прикладных программах.

Отредактировано Nemo3001 (13.06.2024 21:30:12)

0

6

egons
Правда небольшие изменения в SendKeys() я все-таки вносил для своих целей, чтобы процедура работала более предсказуемо.

Например, отключил в конце нее отпускание клавиши ALT: это мешало в некоторых случаях, и сначала было непонятно, почему это прикладная программа странно себя ведет, получая безобидные команды для нажатия клавиш.

Код:
    ;отключил Release ALT key потому что может срабатывать вызов главного меню программы (например, в окне Блокнота и в других окнах)
    ;keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0) ; Release ALT key in case user forgot.

А еще добавлял туда обработку положения курсора мыши, используя мышь для управления этой процедурой во время ее работы (для приостановки, возобновления, прекращения ее работы). И сделал некоторые другие дополнения.

Но тут ведь исходный код процедуры SendKeys() доступен: дополняй и исправляй ее, как потребуется.

Отредактировано Nemo3001 (13.06.2024 21:56:55)

0

7

С keybd_event_() я долго мучился пока не узнал? что в AutoIt3 используется SendKeys() и перейдя на неё стало работать как часы, без тормозов. На WinXP я годами использовал прогу на AutoIt3, а сейчас годами использую на Win10x64, ну и от пользователей не слышал проблем.

Nemo3001 написал(а):

Но тут ведь исходный код процедуры SendKeys() доступен: дополняй и исправляй ее, как потребуется.

На оф.форуме стали обсуждать, чтобы выкладывать код под лицензией MIT, потому что без неё в некоторых странах можно получить иск в суд, используя чужой код.

Отредактировано AZJIO (14.06.2024 06:34:05)

0

8

9 лет назад писал программу для себя, работала
https://g0blinish.ucoz.ru/pb/keys.zip

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Послать стринг (или символы с клавиатуры) из программы в чужое окно