Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Sterowanie programem za pomocą symulacji klawiszy

Ostatnio zmodyfikowano 2014-05-08 21:39
Autor Wiadomość
bear
Temat założony przez niniejszego użytkownika
Sterowanie programem za pomocą symulacji klawiszy
» 2014-05-06 23:15:13
Witam,

mam dość irytujący mnie problem dotyczący sterowaniem innym programem za pomocą symulacji klawiszy. Chodzi tutaj dokładnie o to że chce sterować napisanym przeze mnie programem w C++ aplikacją Microsoft Power Point. Dokładnie mówiąc po wyborze odpowiedniej cyfry z menu aplikacji, chce aby w prezentacji Power Point zmienił się slajd na ten który docelowo będzie zaprogramowany w moim programie. Zauważyłem że nie ma za wielu możliwości przełączania slajdów w Power Point dlatego myślałem nad zasymulowaniem odpowiedniego klawisza który odpowiedzialny jest za przełączanie slajdów. Problem polega na tym że program nie widzi ani Power Pointa ani okna (prezentacji) otwartej klawiszem F5, za to widzi wszelakie programu typu Notepad, Chrome, Dev-C++ itp. Do wyszukiwania klas okna używam WinID oraz WindowsSpy. W dodatku bardzo często nie wywołuje się funkcja SetForegroundWindow odpowiedzialna za przechodzenie do zdefiniowanego przedtem programu. Program jest uproszczony bo póki nie mam chwytu okna nic nie mogę zrobić:
C/C++
#include <iostream>
#include <conio.h>
#include <windows.h>


using namespace std;
int nOpcja;
int nrs = 1;


int main( int argc, char * argv[] )
{
    while( nrs > 0 )
    {
        cout << "     Wybór" << endl;
        cout << "=================================" << endl;
        cout << "1. Z" << endl;
        cout << "2. P" << endl;
        cout << "3. S" << endl;
        cout << "4. K" << endl << endl;
        cin >> nOpcja;
       
        switch( nOpcja )
        {
        case 1:
           
            HWND hwnd;
            hwnd = FindWindow( "notepad", 0 );
           
            if( hwnd )
            {
                SetForegroundWindow( hwnd );
                printf( "FOUND\n" );
                getch();
            } else
            {
                printf( "NOT FOUND" );
                getch();
            }
            break;
        case 2:
            break;
        case 3:
            break;
        case 4:
            break;
        default:
            cout << "Koniec programu. Bye bye!" << endl;
        }
    }
}

Dziękuje z góry
P-109397
Chlorek
» 2014-05-07 01:03:04
Generalnie to wszystko to są okna, czemu nie wykrywają ci te aplikacje tego to nie wiem. Ale zawsze możesz zrobić sobie log z GetForegroundWindow() i znaleźć info o poszukiwanym oknie. Co do sterowania symulacją klawiszy - według mnie kiepski pomysł. O wiele lepiej jest to zrobić znajdując uchwyty do wybranych kontrolek (np buttonów) i "klikać" je z poziomu kodu.

Co do SetForegroundWindow(), nie spotkałem się jeszcze by nie działało. Zapewne uchwyt jest zły skoro nie działa. Co do pobierania uchwytów do okien nie używaj samej nazwy, bo to może być zgubne.
P-109404
bear
Temat założony przez niniejszego użytkownika
» 2014-05-07 11:16:17
Teraz widzę że problem jest w tym że cały pakiet microsoft'a (word, power point ...) ma tą samą klasę okna czyli NetUIHWND i po tej nazwie FindWindow() nie widzi programu mimo tego że pobierając klasę do innych programów wszystko jest w porządku. Próbowałem dodać drugi argument czyli nazwę okna ale również to nie przyniosło żadnego skutku przez co aplikacja nie widzi okna.
W takim przypadku jak uzyskać uchwyt do danego okna?
P-109415
Adik80
» 2014-05-07 13:41:17
Ale powerpoint wlasnie daje mozliwosc sterowania poprzez OLE. Slowa kluczowe dla googla to "powerpoint ole automation"
P-109422
bear
Temat założony przez niniejszego użytkownika
» 2014-05-08 15:21:11
Czy jesteś w stanie jakoś rozwinąć tą myśl? Spotkałem się i z VBA w Power Point chociaż informacji o tym jest bardzo mało, co do sterowania odzielnym kodem w OLE to jest jeszcze tego mniej
P-109494
Adik80
» 2014-05-08 21:39:22
Dzieki OEL mozesz otworzyc i sterowac powerpointem wewnatrz wlasnej aplikacji (potrzebujesz tylko poustawiac sciezki do mso.dll etc.)

C/C++
#import "mso.dll" named_guids, rename("DocumentProperties","MsoDocumentProperties"), rename("RGB","MsoRGB")
using namespace Office;
#import "VBE6EXT.OLB" raw_interfaces_only
#import "MSPPT.olb" rename("RGB","PpRGB")

int _tmain( int argc, _TCHAR * argv[] )
{
    PowerPoint::_ApplicationPtr app;
    try
    {
        CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );
        app.CreateInstance( L"PowerPoint.Application" );
        app->PutVisible( Office::msoTrue );
        app->Presentations->Open( _bstr_t( "Prezentacja.ppt" ), Office::msoFalse, Office::msoFalse, Office::msoTrue );
       
        app->ActivePresentation->SlideShowSettings->Run();
        Sleep( 1000 );
        app->ActivePresentation->SlideShowWindow->View->Next();
        Sleep( 1000 );
        app->ActivePresentation->SlideShowWindow->View->Next();
        Sleep( 1000 );
        app->ActivePresentation->SlideShowWindow->View->GotoSlide( 1, Office::msoTrue );
        Sleep( 1000 );
        app->ActivePresentation->SlideShowWindow->View->GotoSlide( 5, Office::msoTrue );
        Sleep( 1000 );
    }
    catch( _com_error & e )
    {
        MessageBoxW( 0, e.Description(), e.ErrorMessage(), MB_OK );
    }
    catch(...)
    {
        MessageBoxW( 0, L"Exception", L"Unkn", MB_OK );
    }
    if( app )
    {
        app->Quit();
        app = 0;
    }
    CoUninitialize();
    return 0;
}
P-109527
« 1 »
  Strona 1 z 1