Обмен данными между процессами, посредством сообщений Windows

Страницы работы

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.

Содержание работы

Лекция 13

Обмен данными между процессами, посредством сообщений Windows

#include <windows.h>

LRESULT CALLBACK MyWndProc(HWND, UINT, WPARAM, LPARAM);

HDC hdc;

RECT rt;

int WINAPI WinMain(HINSTANCE hInstance,

                     HINSTANCE hPrevInstance,

                     LPSTR     lpCmdLine,

                     int       nCmdShow)

{

            HWND hWnd;

            MSG msg;

            WNDCLASS wc;

            LPCSTR lpszAppName="CTemplate#1";

            BOOL ret;

            //И Н И Ц И А Л И З А Ц И Я    К Л А С С А    О К Н А

            wc.lpszClassName     = lpszAppName;//Имя класса окна

            wc.hInstance=hInstance;//дескриптор экземпляра приложения

            wc.lpfnWndProc        = (WNDPROC)MyWndProc;//указатель на процедуру окна

            wc.hCursor                 = LoadCursor(NULL, IDC_ARROW);//вид курсора над окном

            wc.hIcon                                 = 0;//LoadIcon(hInstance, (LPCTSTR)IDI_CTEMPLATE);

                                                                  //идентификатор пиктограммы

            wc.lpszMenuName    = 0;//идентификатор ресурса меню

            wc.hbrBackground     = (HBRUSH)(COLOR_WINDOW+1); //цвет закраски окна

            wc.style                                  = CS_HREDRAW | CS_VREDRAW;//стиль окна

            wc.cbClsExtra                        = 0;//рудимент, инициализируется нулём

            wc.cbWndExtra         = 0;//рудимент, инициализируется нулём

            if(!RegisterClass(&wc)) //Регистрация класса окна

                                                            return 0;

   hWnd = CreateWindow(

lpszAppName, //Имя класса окна

                        lpszAppName, //Имя окна

                        WS_OVERLAPPEDWINDOW, //Стиль окна (перекрывающееся окно)

                        100,//CW_USEDEFAULT, //x-коорд. верхнего-левого угла

                        100,                                      //y-коорд. верхнего-левого угла

                        400,//CW_USEDEFAULT, //ширина

                        200,                                       //высота

                        NULL, //дескриптор родительского окна

                        NULL, //дескриптор меню

                        hInstance, //дескриптор экземпляра приложения

                        NULL);//указатель на структуру,

                                     //содержащую дополнительные параметры окна

    ret=RegisterHotKey(hWnd,0xB001, MOD_CONTROL | MOD_ALT, 'W');

            ShowWindow(hWnd,SW_HIDE);//SW_SHOW... способ представления окна

            UpdateWindow(hWnd);//прорисовывает клиентскую область окна,

                                                  //генерирует сообщение WM_PAINT

            while (GetMessage(&msg, NULL, 0, 0)) {//Извлечение сообщения из очереди

                                                                                //сообщений

                        TranslateMessage(&msg);//трансляция сообщений

//виртуальных ключей WM_KEYDOWN, //WM_KEYDOWN, WM_KEYUP и т.п.

                                                                 //в сообщение символа  WM_CHAR

                        DispatchMessage(&msg);//направляет сообщения оконной процедуре

            }

            return msg.wParam;

}

LRESULT CALLBACK MyWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

            PAINTSTRUCT ps;

switch (message)

            {

                case WM_DESTROY://сообщение генерируется при уничтожении окна

                  PostQuitMessage(0);//указывает системе штатно выполнить выход из программы

                                    break;

                 case WM_HOTKEY:

                   ShowWindow(hWnd,SW_SHOWNORMAL);

                                    break;

                 case WM_PAINT:

                                    hdc = BeginPaint(hWnd, &ps);

                                    GetClientRect(hWnd, &rt);

                                    DrawText(hdc, "From Paint", strlen("From Paint"), &rt, DT_CENTER);

                                    EndPaint(hWnd, &ps);

                                    break;

                 case WM_COPYDATA:

                        GetClientRect(hWnd, &rt);

                        hdc =GetDC(hWnd);

                        DrawText(hdc, (char*)(((COPYDATASTRUCT*)lParam)->lpData),

                                                 ((COPYDATASTRUCT*)lParam)->cbData, &rt, DT_LEFT);

                        ReleaseDC(hWnd,hdc);

            //MessageBox(NULL,(char*)(((COPYDATASTRUCT*)lParam)->lpData),"",MB_OK);

                                    break;

                        default:

                                    return DefWindowProc(hWnd, message, wParam, lParam);

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

   }

Функции работы с окнами экспортируются библиотекой user32.dll, следовательно компоновать исполняемый модуль надо с библиотекой импорта user32.lib!

#include <windows.h>

int main(){

            HWND hWnd;

            COPYDATASTRUCT data;

            char str[80];

            hWnd=FindWindow(NULL,"CTemplate#1");

            do{

               gets(str);

               data.cbData=strlen(str);

               data.lpData=str;

               SendMessage(hWnd, WM_COPYDATA, (WPARAM)GetFocus(), (LPARAM)&data);

            }while(strcmp(str,"quit"));

 return 0;

}

typedef struct {

    HWND hwnd;  //Дескриптор окна-получателя

    UINT message; //Идентификатор сообщения (WM_...)

    WPARAM wParam; //Дополнительная информация (зависит от сообщения)

    LPARAM lParam; //Дополнительная информация (зависит от сообщения)

    DWORD time; //Время посылки сообщения

    POINT pt; //Положение курсора, когда посылалось сообщение

} MSG, *PMSG;

Окна предопределенных стилей. Диалоги. Ресурсы.

Файл d1.c

#include <windows.h>

#include "resource.h"

LRESULT CALLBACK

DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance,

                     HINSTANCE hPrevInstance,

                     LPSTR     lpCmdLine,

                     int       nCmdShow)

{

            MSG msg;

            DialogBox(hInstance,(LPCTSTR)IDD_DLGTEST,NULL,(DLGPROC)DlgProc);

            while (GetMessage(&msg, NULL, 0, 0)) {

                                    TranslateMessage(&msg);

                                    DispatchMessage(&msg);

            }

            return msg.wParam;

}


LRESULT CALLBACK

DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){

            char strText[100];

            switch (message)

            {

                        case WM_INITDIALOG:

                                               return TRUE;

                        case WM_COMMAND:

                                    switch (LOWORD(wParam) )

                                    {

                                               case IDOK:

                                                           PostQuitMessage(0);

                                                           return TRUE;

                                               case IDCANCEL:

                                                           PostQuitMessage(0);

                                                           return TRUE;

                                               case IDC_BTN1:

                                                           GetDlgItemText(hDlg,IDC_EDIT1,strText,100);

                                                           SetDlgItemText(hDlg,IDC_EDIT2,strText);

                                                           SetDlgItemText(hDlg,IDC_EDIT1,"");

                                               break;

                                    }

                        break;

                        default:

                                    return FALSE;

            }

}

#include <windows.h>

#include "resource.h"

IDD_DLGTEST DIALOG DISCARDABLE  0, 0, 186, 95

STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU

CAPTION "Dialog"

FONT 8, "MS Sans Serif"

BEGIN

    DEFPUSHBUTTON   "OK",IDOK,129,7,50,14

    PUSHBUTTON      "Cancel",IDCANCEL,129,24,50,14

    PUSHBUTTON      "Down",IDC_BTN1,7,49,43,15

    EDITTEXT        IDC_EDIT1,7,7,77,18,ES_AUTOHSCROLL

    EDITTEXT        IDC_EDIT2,7,24,77,18,ES_AUTOHSCROLL

END

 
Файл d1.rc

Файл resource.h

#define IDD_DLGTEST                     101

#define IDC_EDIT1                       1000

#define IDC_EDIT2                       1001

#define IDC_BTN1                        1002

>rc d1.rc       (Компилятор ресурсов)

>cl d1.c  d1.res user32.lib

Упражнение 1: протестировать программы, разобранные на лекции.

Упражнение 2: написать примитивный калькулятор с интерфейсом, представленным диалоговым окном.

Упражнение 3: организовать передачу данных на основе WM_COPYDATA между двумя приложениями с диалоговыми окнами.

Похожие материалы

Информация о работе

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.