PureBasic - форум

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

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


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Передать нажатие клавиши в другую программу


Передать нажатие клавиши в другую программу

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

1

Из программы на пурике надо запустить процесс в другой программе, для чего нажать "там" клавишу, допустим F7.
Подскажите, как это сделать. Можно ли для этого не делать активной эту другую программу?

0

2

Не делая её активной? Вы имеете ввиду чтоб программа была либо свернута либо её окно не было активно? Я все правильно понял?

0

3

Программное нажатие (2 раза) на экранную кнопку с цифрой 2 в стандартном калькуляторе:

Код:
; Поиск чужого окна(кнопки, переключателя и т.п.)  в чужой программе и нажатие на него программно (около 3кб в exe) 
; Эти три нижние строки изменить в соответствии со своими нуждами. 

 WNDNAME1.s= "2" ; текст на кнопке!                          
 WNDNAME2 .s= "Калькулятор" ; текст главного окна! 
 EXENAME.s= "Calc.exe" ; Имя проги которую будем запускать! Но можно и руками запустить... 

 ; ********** Собственно программа******************* 

 RunProg = WinExec_(EXENAME.s, #SW_SHOWNORMAL ) 
  Repeat 
  ; Поиск главного окна программы 
  HWND1=FindWindow_(0,WNDNAME2) 
   Delay(1) 
  Until HWND1>0 ; если нашли хендл главного окна то выходим из цикла 
   
  ;Поиск кнопки 
 Repeat 
 HWND2=FindWindowEx_(HWND1,0, 0,WNDNAME1); ищем дочернее окно(кнопку) главного окна WNDNAME2 
 Delay(1) 
 Until HWND2>0;  если нашли хендл дочернего окна то выходим из цикла 

 EnableWindow_(HWND2,#True); ну это небольшой хакерский прием, если кнопка недоступна, хотя это лишнее - она и так нажмётся 

 PostMessage_(HWND2,#BM_CLICK,0,0); собственно нажимаем на кнопку 
 PostMessage_(HWND2,#BM_CLICK,0,0); собственно нажимаем на кнопку

 End

Здесь есть несколько примеров http://purebasic.info/phpBB2/viewtopic.php?t=21

0

4

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

для чего нажать "там" клавишу, допустим F7.

По моему человеку надо не кнопку в программе нажать, а послать в программу нажатие клавиши с клавиатуры! Для этого всё же нужно, что бы программа была в фокусе.
Клавиши нажимаются так

Код:
keybd_event_(#VK_F7,1,0,0)
keybd_event_(#VK_F7,1,#KEYEVENTF_KEYUP,0)

0

5

Мне надо "послать в программу нажатие клавиши с клавиатуры".
В чужую запущенную, свернутую или неактивную программу.
Если нет другого способа, кроме как делать ее активной, подскажите как дать ей фокус, а затем забрать его обратно.

Пётр, спасибо за пример, сейчас попробую посмотреть, что он делает.

0

6

Все работает, остался только вопрос про фокус.

0

7

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

вопрос про фокус.

Вот полный код - вызывает справку в калькуляторе

Код:
EXENAME.s= "Calc.exe" ; Имя проги которую будем запускать! Но можно и руками запустить... 

 ; ********** Собственно программа******************* 

 RunProg = WinExec_(EXENAME, #SW_SHOWNORMAL ) 


; Поиск главного окна программы - калькулятора
Repeat
  hWnd=FindWindow_("SciCalc",0) 
   Delay(1) 
  Until hWnd>0 ; если нашли хендл главного окна то выходим из цикла 

; передать фокус

Procedure SetForegroundWindow(hWnd) 
	 	 
	If GetWindowLong_(hWnd, #GWL_STYLE) & #WS_MINIMIZE 
	ShowWindow_(hWnd, #SW_MAXIMIZE) 
	UpdateWindow_(hWnd) 
	EndIf 
	foregroundThreadID = GetWindowThreadProcessId_(GetForegroundWindow_(), 0) 
	ourThreadID = GetCurrentThreadId_() 
	 
	If (foregroundThreadID <> ourThreadID) 
	AttachThreadInput_(foregroundThreadID, ourThreadID, #True); 
	EndIf 
	 	
	SetForegroundWindow_(hWnd) 
	
	If (foregroundThreadID <> ourThreadID) 
	AttachThreadInput_(foregroundThreadID, ourThreadID, #False) 
	EndIf   
	 
	InvalidateRect_(hWnd, #Null, #True) 
EndProcedure  

SetForegroundWindow(hWnd); передать фокус
;Вызвать справку 
keybd_event_(#VK_F1,1,0,0)
keybd_event_(#VK_F1,1,#KEYEVENTF_KEYUP,0)

ShowWindow_(hWnd,#SW_HIDE) ; спрятать 

Delay(3000)
ShowWindow_(hWnd,#SW_SHOW) ; показать

0

8

ВиниПур, спасибо за код.

Единственная проблема - калькулятор при скрытии пропадает из панели задач и списка запущенных приложений, хотя в списке процессов он остается. (Пробовал и с notepad.exe)
Это можно изменить?
(Две последние строчки надо закомментировать для теста)

Отредактировано Civil (05.06.2011 23:16:27)

0

9

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

Это можно изменить?

Замени команду скрыть на команду свернуть

Код:
ShowWindow_(hWnd,#SW_SHOWMINIMIZED) ; спрятать

Учи API!!!
Все команды для этой функции

· hWnd
Identifies the window.

· nCmdShow
Specifies how the window is to be shown. This parameter is ignored the first time an application calls ShowWindow, if the program that launched the application provides a STARTUPINFO structure. Otherwise, the first time ShowWindow is called, the value should be the value obtained by the WinMain function in its nCmdShow parameter. In subsequent calls, this parameter can be one of the following values:
SW_HIDE
Hides the window and activates another window.
SW_MAXIMIZE
Maximizes the specified window.
SW_MINIMIZE
Minimizes the specified window and activates the next top-level window in the Z order.
SW_RESTORE
Activates and displays the window. If the window is minimized or maximized, Windows restores it to its original size and position. An application should specify this flag when restoring a minimized window.
SW_SHOW
Activates the window and displays it in its current size and position.
SW_SHOWDEFAULT
Sets the show state based on the SW_ flag specified in the STARTUPINFO structure passed to the CreateProcess function by the program that started the application.
SW_SHOWMAXIMIZED
Activates the window and displays it as a maximized window.
SW_SHOWMINIMIZED
Activates the window and displays it as a minimized window.
SW_SHOWMINNOACTIVE
Displays the window as a minimized window. The active window remains active.
SW_SHOWNA
Displays the window in its current state. The active window remains active.
SW_SHOWNOACTIVATE
Displays a window in its most recent size and position. The active window remains active.
SW_SHOWNORMAL
Activates and displays a window. If the window is minimized or maximized, Windows restores it to its original size and position. An application should specify this flag when displaying the window for the first time.

0

10

Спасибо. У вас очень доброжелательный форум, видимо как компенсация суровости пурика : )

0

11

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

Спасибо. У вас очень доброжелательный форум, видимо как компенсация суровости пурика : )

Что бы ты интересно сказал о суровости С++? Форумы Сишников реально отстойные...

0

12

Я начинал с Паскаля, так что Сишная запись меня никогда не радовала.
Но говоря про суровость я в первую очередь имел ввиду плохую документированность пурика.
Но зато - где еще увидишь работающую программу размером 18кБ : )

0

13

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

имел ввиду плохую документированность пурика.

Все команды (операторы, функции и т. д.), а так же описание IDE можно найти в справке.
Вот русскоязычный вариант http://www.pure-basic.narod.ru/PureBasic.chm

А WinAPI функции, это функции операционной системы Windows, а не пурика, поэтому их описание нужно искать на сайте майкрософт.

0

14

ASM вставки тоже из другой эпопеи...

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Передать нажатие клавиши в другую программу