Из программы на пурике надо запустить процесс в другой программе, для чего нажать "там" клавишу, допустим F7.
Подскажите, как это сделать. Можно ли для этого не делать активной эту другую программу?
Передать нажатие клавиши в другую программу
Сообщений 1 страница 14 из 14
Поделиться105.06.2011 17:16:57
Поделиться205.06.2011 17:40:08
Не делая её активной? Вы имеете ввиду чтоб программа была либо свернута либо её окно не было активно? Я все правильно понял?
Поделиться305.06.2011 17:45:27
Программное нажатие (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
Поделиться405.06.2011 18:05:32
для чего нажать "там" клавишу, допустим F7.
По моему человеку надо не кнопку в программе нажать, а послать в программу нажатие клавиши с клавиатуры! Для этого всё же нужно, что бы программа была в фокусе.
Клавиши нажимаются так
keybd_event_(#VK_F7,1,0,0) keybd_event_(#VK_F7,1,#KEYEVENTF_KEYUP,0)
Поделиться505.06.2011 19:07:56
Мне надо "послать в программу нажатие клавиши с клавиатуры".
В чужую запущенную, свернутую или неактивную программу.
Если нет другого способа, кроме как делать ее активной, подскажите как дать ей фокус, а затем забрать его обратно.
Пётр, спасибо за пример, сейчас попробую посмотреть, что он делает.
Поделиться605.06.2011 19:56:34
Все работает, остался только вопрос про фокус.
Поделиться705.06.2011 20:54:00
вопрос про фокус.
Вот полный код - вызывает справку в калькуляторе
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) ; показать
Поделиться805.06.2011 23:10:34
ВиниПур, спасибо за код.
Единственная проблема - калькулятор при скрытии пропадает из панели задач и списка запущенных приложений, хотя в списке процессов он остается. (Пробовал и с notepad.exe)
Это можно изменить?
(Две последние строчки надо закомментировать для теста)
Отредактировано Civil (05.06.2011 23:16:27)
Поделиться905.06.2011 23:38:12
Это можно изменить?
Замени команду скрыть на команду свернуть
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.
Поделиться1006.06.2011 22:32:01
Спасибо. У вас очень доброжелательный форум, видимо как компенсация суровости пурика : )
Поделиться1106.06.2011 22:40:48
Спасибо. У вас очень доброжелательный форум, видимо как компенсация суровости пурика : )
Что бы ты интересно сказал о суровости С++? Форумы Сишников реально отстойные...
Поделиться1206.06.2011 22:58:37
Я начинал с Паскаля, так что Сишная запись меня никогда не радовала.
Но говоря про суровость я в первую очередь имел ввиду плохую документированность пурика.
Но зато - где еще увидишь работающую программу размером 18кБ : )
Поделиться1307.06.2011 00:48:35
имел ввиду плохую документированность пурика.
Все команды (операторы, функции и т. д.), а так же описание IDE можно найти в справке.
Вот русскоязычный вариант http://www.pure-basic.narod.ru/PureBasic.chm
А WinAPI функции, это функции операционной системы Windows, а не пурика, поэтому их описание нужно искать на сайте майкрософт.
Поделиться1407.06.2011 01:54:49
ASM вставки тоже из другой эпопеи...