Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2009, 17:35   #1
x8i
Пользователь
 
Аватар для x8i
 
Регистрация: 13.05.2009
Сообщений: 37
Вопрос Управление Excel через WinApi - не используя СОМ, ОЛЕ и прочие блага цивилизации

Мне нужно написать программу, которая бы открывала файл file1.xls и посредством API(нажимая нужные кнопки посылкой сообщений)организовать поиск строки в книге.(Все это нужно для того чтобы потом использовать такой способ для управления приложением, которое другими способами "снаружи" не управляется)

Сначала я открываю файл и нахожу дескриптор главного окна(хотя я не уверен что именно оно главное)
затем пытаюсь в два списка вывести пункты меню и имена кнопок(код взял из книги Архангельского - там пример работы с калькулятором)

Код:
bool __stdcall EnumChild(HWND hWind, LPARAM lParam)
{
    HWND *P;
    char buf2[256];
    GetClassName(hWind, buf2, sizeof(buf2));
    if (AnsiString(buf2) == "Button")
    {
        SendMessage(hWind, WM_GETTEXT, sizeof(buf), (LPARAM)(LPCTSTR)buf);
        if (buf[0] != 0)
        {
            P = (HWND *)malloc(sizeof(HWND));
            *P = hWind;
            BList->Add(P);
            Form1->ListBox2->Items->Add(buf);
        }
    }
    return true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    if (!(hWnd = FindWindow("XLMAIN", 0)))
    {
        ShellExecute(Handle, NULL, "ГТД .xls", NULL, NULL, SW_RESTORE);
        hWnd = FindWindow("XLMAIN", 0);
    }
 
    HMENU HM = GetMenu(hWnd);
    HMENU SubM = NULL;
    int CountM = GetMenuItemCount(HM);
    int CountS;
    UINT *P;
 
    char *t;
    for(int i = 0; i < MList->Count; i++)
        free(MList->Items[i]);
    for(int i = 0; i < BList->Count; i++)
        free(BList->Items[i]);
    MList->Clear();
    BList->Clear();
    ListBox1->Clear();
    ListBox2->Clear();
 
    for(int i = 0; i < CountM; i++)
    {
        if(SubM = GetSubMenu(HM, i))
        {
            CountS = GetMenuItemCount(SubM);
            for(int k = 0; k < CountS; k++)
            {
                GetMenuString(SubM, k, buf, sizeof(buf), MF_BYPOSITION);
                if(buf[0] != 0)
                {
                    P = (UINT *)malloc(sizeof(UINT));
                    *P = GetMenuItemID(SubM, k);
                    MList->Add(P);
                    if(t = strchr(buf, '&'))
                    {
                        *t = 0;
                        strcat(buf, t + 1);
                    }
                    if(t = strchr(buf, '\t')) *t = 0;
                    ListBox1->Items->Add(buf);
                }
            }
        }
    }
    EnumChildWindows(hWnd, (WNDENUMPROC)EnumChild, 0);
}
В итоге ничево в списках не выводится... Подскажите пожалуйста если кто такое уже делал, какое имя класса у главного окна Excel(если проблема в этом) или что здесь может быть еще не так?
C++ Builder 6
x8i вне форума Ответить с цитированием
Старый 20.08.2009, 10:59   #2
x8i
Пользователь
 
Аватар для x8i
 
Регистрация: 13.05.2009
Сообщений: 37
По умолчанию

if (!(hWnd = FindWindow("XLMAIN", 0)))
{
ShellExecute(Handle, NULL, "ГТД .xls", NULL, NULL, SW_RESTORE);
hWnd = FindWindow("XLMAIN", 0);
}
EnumChildWindows(hWnd, (WNDENUMPROC)EnumChild, 0);
SetActiveWindow(hMenu);
PressKey(VK_CONTROL);
ClickKey(int('F'));
ReleaseKey(VK_CONTROL);

Clipboard()->Clear();
Clipboard()->AsText = "10101110/160709/0001939";

PressKey(VK_CONTROL);
ClickKey(int('V'));
ReleaseKey(VK_CONTROL);

ClickKey(VK_RETURN);
ClickKey(VK_ESCAPE);
C++ Builder 6
x8i вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение свойств кнопки через WinAPI Никки Win Api 12 20.09.2009 15:01
Отправка данных в СОМ порт из под VBA Excel Abhcn Microsoft Office Excel 3 03.03.2009 23:56
работа с компонентами через WinApi user_jasser Win Api 17 17.11.2008 22:11
ОЛЕ!ОЛЕ!ОЛЕ!РОССИЯ ВПЕРЕД!!! Elm0 Свободное общение 58 22.07.2008 19:10
СОМ порт IR управление мультимедиа Andr12 Свободное общение 2 10.02.2007 12:07