Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ShellExecute, iexplorer страница как результат. 
:(
    Опции темы
azesmcar
Дата 20.2.2007, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Код

int main()
{
    HWND hw = GetForegroundWindow();
    AttachThreadInput( GetWindowThreadProcessId( hw, NULL ), GetCurrentThreadId(), true );
    std::cout << GetFocus() << std::endl;
        return 0;
}


Да вроде бы так...хотя у меня пока независимо от фокуса один и тот же хендл возвращяет
PM   Вверх
Opik
Дата 20.2.2007, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



Извините за банальный вопрос, но что нужно подключить, что бы заработал ShellExecute? smile)) И вообще как определять что нужно подключать в тех или иных случаях?
PM MAIL Skype   Вверх
Opik
Дата 20.2.2007, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



так, с этим сам разобрался smile
PM MAIL Skype   Вверх
Opik
Дата 20.2.2007, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



azesmcar, 
Что ещё немаловажно, окно создается с параметрами SW_HIDE
PM MAIL Skype   Вверх
Rockie
Дата 21.2.2007, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Opik, msdn говорит что
Цитата
Function Information

Minimum DLL Version shell32.dll version 3.51 or later 
Custom Implementation No 
Header shellapi.h
Import library shell32.lib 
Minimum operating systems Windows NT 4.0, Windows 95 
Unicode Implemented as ANSI and Unicode versions.  

p.s.: сам не проверял.

Добавлено @ 01:41 
Цитата(Opik @  20.2.2007,  18:42 Найти цитируемый пост)
так, с этим сам разобрался 

этот пост я уже проспал smile




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Opik
Дата 23.2.2007, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



А каким образом можно получить Thread ID процесса, созданного, через ShellExecute?
PM MAIL Skype   Вверх
codelord
Дата 24.2.2007, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 1
Всего: 39



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

bool GetProcessByExeName(DWORD* Pid, String ExeName,DWORD* YPid) //
{
HANDLE hProcessSnap = NULL;
PROCESSENTRY32 pe32      = {0};
String temp="";

hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
pe32.dwSize=sizeof(PROCESSENTRY32);

if(Process32First(hProcessSnap,&pe32)) temp=pe32.szExeFile; 
if((temp.UpperCase()).Pos(ExeName.UpperCase()))
       {
       if(pe32.th32ParentProcessID==*YPid)
       {
         *Pid= pe32.th32ProcessID;
         CloseHandle (hProcessSnap);
         return true;
        }
       }
pe32.dwSize=sizeof(PROCESSENTRY32);

while(Process32Next(hProcessSnap,&pe32))
        {
        temp=pe32.szExeFile;
        if((temp.UpperCase()).Pos(ExeName.UpperCase()))
                {
                if(pe32.th32ParentProcessID==*YPid)
                         {
                         *Pid= pe32.th32ProcessID;
                          CloseHandle (hProcessSnap);
                          return true;
                         }
                }
        pe32.dwSize=sizeof(PROCESSENTRY32);
        }
        
CloseHandle(hProcessSnap);
*Pid=0;
return false;
}

пользуемся так:
Код

 DWORD pid, YPid; //pid это создаваемого процесса, а YPid твоей проги
 YPid=getpid();
 ShellExecute(Handle,NULL,"notepad.exe",NULL,NULL,SW_RESTORE);
 GetProcessByExeName(&pid,"notepad.exe",&YPid);
 // Edit1->Text = pid; //тут уже будет нужный пид созданный по шелл экзекюте

подрубаем хедеры
#include "tlhelp32.h"
#include <process.h>
делал Borland BCB 6.0, но та в принципе API поэтому должно  работать в других средах..

Это сообщение отредактировал(а) codelord - 24.2.2007, 13:59


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Opik
Дата 24.2.2007, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



codelord, 
На моем примере я запускаю iexplorer.exe, а если у пользователя уже будет запущен оный?

Добавлено @ 15:49 
codelord, 
+ Нужен именно Thread ID, созданного процесса.
Код

AttachThreadInput(  GetCurrentThreadId(), threadID, true );

PM MAIL Skype   Вверх
codelord
Дата 24.2.2007, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 1
Всего: 39



Цитата

На моем примере я запускаю iexplorer.exe, а если у пользователя уже будет запущен оный?

если у пользователя был запущен не тобой, то код покажет пид твоего, того которая запустила твоя прога, т.е. родителский пид запущенного процесса должен быть пид твоей проги, а если запустил не ты будет 0.

Это сообщение отредактировал(а) codelord - 24.2.2007, 20:09


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Opik
Дата 24.2.2007, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



codelord, 
Насколько я понял по коду, возращается pid, a не thread id
PM MAIL Skype   Вверх
codelord
Дата 25.2.2007, 03:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 1
Всего: 39



Цитата(Opik @  24.2.2007,  16:31 Найти цитируемый пост)
codelord, Насколько я понял по коду, возращается pid, a не thread id

правильно, это я отвечал на 
Цитата(Opik @  24.2.2007,  11:47 Найти цитируемый пост)
codelord, На моем примере я запускаю iexplorer.exe, а если у пользователя уже будет запущен оный?

, а про ThreadID не очень догоняю, потому как я понимаю если ShellExecute () запустит прогу 
которая создаст 100 потоков, какой именно забрать?

Добавлено @ 03:16 
 думаю смотреть надо в сторону
GetWindowThreadProcessId, ищем нужное окно и забираем Id потока который его создал.


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
codelord
Дата 25.2.2007, 03:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 1
Всего: 39



вот запусти IEXPLORE который ты видимо будешь запускать через ShellEx.. и посмотри в диспетчере сколько у него потоков.
который из них нужен?


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Opik
Дата 25.2.2007, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



codelord, 
А будет ли GetWindowThreadProcessId работать, если окно SW_HIDE? Ведь как такового окна не будет?
PM MAIL Skype   Вверх
azesmcar
Дата 26.2.2007, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата

А будет ли GetWindowThreadProcessId работать, если окно SW_HIDE? Ведь как такового окна не будет?


Будет..окно есть, просто его не видно..Я думаю тебе нужен поток обработки сообщений основного окна..codelord верно сказал..тебе нужна функция GetWindowThreadProcessId..
А насчет получение ID процесса..лучше используй ShellExecuteEx. Он возвращяет..

Но учти что
Цитата


hProcess - Handle to the newly started application. This member is set on return and is always NULL unless fMask is set to SEE_MASK_NOCLOSEPROCESS. Even if fMask is set to SEE_MASK_NOCLOSEPROCESS, hProcess will be NULL if no process was launched. For example, if a document to be launched is a URL and an instance of Microsoft® Internet Explorer is already running, it will display the document. No new process is launched, and hProcess will be NULL. 

typedef struct _SHELLEXECUTEINFO{
    DWORD cbSize; 
    ULONG fMask; 
    HWND hwnd; 
    LPCTSTR lpVerb; 
    LPCTSTR lpFile; 
    LPCTSTR lpParameters; 
    LPCTSTR lpDirectory; 
    int nShow; 
    HINSTANCE hInstApp; 
 
    // Optional members 
    LPVOID lpIDList; 
    LPCTSTR lpClass; 
    HKEY hkeyClass; 
    DWORD dwHotKey; 
    union {
  HANDLE hIcon;
  HANDLE hMonitor;
    } DUMMYUNIONNAME;
    HANDLE hProcess; 
} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO; 


PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0614 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.