Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11855
Последний выпуск: 19.06.2015

WinApi. Окно не молучает/не отправляет windows сообщения

47K
24 июля 2012 года
ryabinin313
13 / / 07.11.2009
Здравствуйте! У меня есть две простейшие программы.
Первая: Простое winapi окно.


Код:
#include <Windows.h>
#include <iostream>
using namespace std;

HINSTANCE hInstance;
HWND hwnd;

LRESULT CALLBACK WindowFunc(HWND, UINT,WPARAM,LPARAM);
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);

int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode)
{
    //HMODULE dll = LoadLibrary(L"window.dll");
    //int i = 0;
    //while(++i<1000000)
    //{
    //  i++;
    //  --i;
    //}

    //cin >> i;
    //ShowWnd = (MY_FUNC)GetProcAddress(/*GetModuleHandleA("window.dll")*/dll, "ShowWnd"); 
    //ShowWnd();

    //return;

    WNDCLASS wnd;

    memset(&wnd,0,sizeof(WNDCLASS));

    wnd.style = CS_OWNDC|CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS|CS_GLOBALCLASS;
    wnd.lpfnWndProc = (WNDPROC)WndProc;
    wnd.hInstance = hThisInst;
    wnd.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
    wnd.lpszClassName = L"WebexWindowClass";
    wnd.lpszMenuName = NULL;
    wnd.hCursor = LoadCursor(NULL,IDC_ARROW);
    wnd.hIcon = NULL;

    BOOL res = RegisterClass(&wnd);
    hInstance = hThisInst;

    hwnd = CreateWindowEx(WS_EX_TOPMOST,L"WebexWindowClass",L"WebexPlugin",WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_CAPTION|WS_SYSMENU,225,175,350,250,NULL,NULL,hInstance,NULL);
    ShowWindow(hwnd,SW_SHOW);

    MSG msg;
    while(GetMessage(&msg, NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 1;
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    int a = 0;
    switch (msg)
    {
    case WM_COPYDATA:
        a = 1;
        break;
    default:
        return DefWindowProc(hwnd,msg,wParam,lParam);
    }
   
    return 0;
}
Вторая: находит описанное выше окно и шлет ему сообщение(не важно какое)


Код:
#include <Windows.h>
#include <iostream>
#include <tchar.h>

using namespace std;

void main()
{
    HWND Handle = FindWindow(L"WebexWindowClass", L"WebexPlugin");
    wchar_t* w = new wchar_t[30];
    bool b = IsWindow(Handle);
    GetWindowText(Handle, w, 20);

    int a;
    while(true)
    {
        cin >> a;
        SendMessage(Handle, WM_COPYDATA, 4, 7);
        cout << "next send";
    }
}
Вот я не могу понять, почему сообщения не приходят? Я неправильно создал окно или неправильно шлю сообщения? Вторая программа находит нужное окно правильно(Хендлы совпадают). Что я не так делаю? Знаний в winapi не много, так что буду благодарен подробным ответам.
225
25 июля 2012 года
arrjj
1.7K / / 26.01.2011
PostMessage пробовал?
47K
25 июля 2012 года
ryabinin313
13 / / 07.11.2009
Нет, но на сколько я знаю, PostMessage отличается только тем что кладет сообщение в очередь, а SendMessage сразу посылает его обработчику.
Попробую.
65K
25 июля 2012 года
verholom
48 / / 29.08.2011
И правильно не работает. Почитайте внимательно описание сообщения WM_COPYDATA на сайте МСДН. Там четко описано, что обязательно должно быть окно-отправитель данных и указатель на структуру с данными. Вот как Ваша программа будет работать правильно:

Код:
using namespace std;

        HWND Handle = FindWindow(L"WebexWindowClass", L"WebexPlugin");

        wchar_t* w = new wchar_t[30];
        bool b = IsWindow(Handle);
        GetWindowText(Handle, w, 20);
       
        //Создаем фиктивное окно, которое  буде считаться отсыльщиком сообщения (оно невидимо)
        HWND hStatic=CreateWindow(L"STATIC",NULL,0,0,0,5,5,GetDesktopWindow(),NULL,GetModuleHandle(NULL),NULL);
        //Структура для посылки сообщения
        COPYDATASTRUCT cds={0};
       
        int a;
        while(true)
        {
            cin >> a;
            //Заполняем структуру
            cds.dwData=a;   //Отсылаем тока то, что ввел пользователь
            cds.cbData=0;
            cds.lpData=NULL;

            SendMessage(Handle, WM_COPYDATA, (WPARAM)hStatic, (LPARAM)&cds);
            cout << "next send";
        }
У клиента в lParam - указатель на COPYDATASTRUCT от посылающей программы.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог