powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Функция EnumWindows()
23 сообщений из 48, страница 2 из 2
Функция EnumWindows()
    #38593882
NNN7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,
пробую вот так в 1-ом приложении передать в 2-е:

Код: plaintext
1.
2.
3.
4.
5.
	case WM_COPYDATA:
//отправка сообщения
hw=FindWindow(TEXT("Класс получателя"),TEXT("Получатель"));
if(!hw)MessageBox(NULL, L"Программа получателя не найдена", L"Оконная процедура", MB_OK);
SendMessage(hw,WM_COPYDATA,0,(LPARAM)&p);



но у меня ругается на IpData: 'IpData' : is not a member of 'tagCOPYDATASTRUCT'
...
Рейтинг: 0 / 0
Функция EnumWindows()
    #38593886
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NNN7я просто никогда с таким не сталкивался , сложновато как-то)
память нужно выделить, в неё и копировать строки

p.IpData - сюда указатель на эту память и присваивать
...
Рейтинг: 0 / 0
Функция EnumWindows()
    #38593890
NNN7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,
помогите , как выделить эту память под список? ничего не пойму

получается , что p.IpData - указатель на место , куда записываются новые данные?
...
Рейтинг: 0 / 0
Функция EnumWindows()
    #38593897
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NNN7получается , что p.IpData - указатель на место , куда записываются новые данные?
да
...
Рейтинг: 0 / 0
Функция EnumWindows()
    #38593905
NNN7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил, как же выделить память под полученную информацию? нужно создать какой-то дополнительный список ?
может в WM_COPYDATA нужно как-то написать :
Код: plaintext
1.
2.
 pc=(COPYDATASTRUCT*)IParam;
		strcpy(ListBox1,(char*)pc->lpData);



но всё равно не пойму , что делать
можете помочь, пожалуйста ? хоть немного ,
я уже в тупик зашёл с этой программой
алгоритм вроде понял , но есть некие моменты , которые сложность вызывают((
...
Рейтинг: 0 / 0
Функция EnumWindows()
    #38593907
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилвозможно первое приложение должно запустить второе, дождаться появления у
него окна и затем выполнить передачу данных
Осталось только понять почему второе приложение не в состоянии получить эти данные само,
без посылки от первого...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Функция EnumWindows()
    #38593909
NNN7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, так я ж вроде посылаю данные от 1-ого :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 COPYDATASTRUCT p;  //экземпляр структуры
//заполнение структуры
p.dwData=123;
p.cbData=sizeof(ListBox1);
p.IpData=&ListBox1;


	case WM_COPYDATA:
//отправка сообщения
hw=FindWindow(TEXT("Класс получателя"),TEXT("Получатель"));
if(!hw)MessageBox(NULL, L"Программа получателя не найдена", L"Оконная процедура", MB_OK);
SendMessage(hw,WM_COPYDATA,0,(LPARAM)&p);




но и здесь ругается на
Код: plaintext
1.
 p.IpData=&ListBox1;
...
Рейтинг: 0 / 0
Функция EnumWindows()
    #38593911
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NNN7алгоритм вроде понял , но есть некие моменты , которые сложность вызывают((

Попробуй читать:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms649011(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms649009(v=vs.85).aspx
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Функция EnumWindows()
    #38593917
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NNN7я ж вроде посылаю данные от 1-ого
Вопрос в том - зачем ты это делаешь ? Второму приложению запрещено вызывать
EnumWindows()?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Функция EnumWindows()
    #38593923
NNN7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, не понял, в смысле - зачем ? суть же в том , чтобы первое приложение обрабатывало функцию EnumWindows , а результат выводился во 2-ом приложении
...
Рейтинг: 0 / 0
Функция EnumWindows()
    #38593924
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NNN7суть же в том , чтобы первое приложение обрабатывало функцию EnumWindows , а
результат выводился во 2-ом приложении
Что мешает второму приложению сделать всё самостоятельно?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Функция EnumWindows()
    #38593925
NNN7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, та задание просто такое , я б так не мучился)
...
Рейтинг: 0 / 0
Функция EnumWindows()
    #38593931
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NNN7та задание просто такое
Тогда читай вышеприведённые ссылки. И особенно внимательно часть про что, что "the data
being passed must not contain pointers".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Функция EnumWindows()
    #38593932
NNN7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
у меня походу вообще что попало передаётся
дескриптор списка, а не его данные
как сделать , чтобы данные передавались ?
что нужно вместо p.cbData=sizeof(ListBox1); писать?
...
Рейтинг: 0 / 0
Функция EnumWindows()
    #38593935
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NNN7что нужно вместо p.cbData=sizeof(ListBox1); писать?
Если нет требования передачи за одно сообщение, то лучше всего - тот самый буфер, куда
данные заносятся при поиске окон.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Функция EnumWindows()
    #38593936
NNN7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

в смысле , при поиске окон? какой буфер?
окно ж я так ищу:
Код: plaintext
1.
hw=FindWindow(TEXT("Класс получателя"),TEXT("Получатель"));
...
Рейтинг: 0 / 0
Функция EnumWindows()
    #38593939
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NNN7в смысле , при поиске окон?
При вызове сабжа. Сабжа.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Функция EnumWindows()
    #38593942
NNN7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, я туплю
не понимаю, а каком буфере идёт речь
...
Рейтинг: 0 / 0
Функция EnumWindows()
    #38594091
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NNN7Dimitry Sibiryakov, я туплю
не понимаю, а каком буфере идёт речь
речь о буфере в который помещается текст заголовка очередного окна
...
Рейтинг: 0 / 0
Функция EnumWindows()
    #38596767
NNN7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,
Я вот пару дней думал над этой задачей и вроде что-то написал , но ListBox в получателе всё равно не хочет заполняться . Не знаю, что делать .
Вот 1-я программа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
#include <windows.h>
#include <windowsx.h>
#include <vector>  
 
using namespace std;
vector<TCHAR*> data;   //для переобразования
 
COPYDATASTRUCT p;  //экземпляр структуры
 
LRESULT CALLBACK HelloWorldWndProc(HWND,UINT,UINT,LONG);
BOOL CALLBACK MyEnum(HWND hWnd,LPARAM lParam);
HWND ListBox1;
HWND hw;
 
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{ 
    WNDCLASS WndClass;
    WndClass.style=0;
    WndClass.lpfnWndProc=HelloWorldWndProc;
    WndClass.cbClsExtra=0;
    WndClass.cbWndExtra=0;
    WndClass.hInstance=hInstance;
    WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    WndClass.lpszMenuName=NULL;
    WndClass.lpszClassName=L"Класс отправителя";
 
    if(!RegisterClass(&WndClass))
    {
        MessageBox(NULL,L"Невозможно зарегестрировать класс окна!",L"Ошибка",MB_OK);
        return 0;
    }
 
    HWND hWnd;
    hWnd=CreateWindow(L"Класс отправителя",L"Отправитель",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
        CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
    if(!hWnd)
    {
        MessageBox(NULL,L"Невозможно создать окно!",L"Ошибка",MB_OK);
        return 0;
    }
 
    ShowWindow(hWnd,nCmdShow);
    UpdateWindow(hWnd);
 
     //заполнение структуры
p.dwData=123;
p.cbData=sizeof(data);
p.lpData=&data;
 
 
    MSG Msg;
    while(GetMessage(&Msg,NULL,0,0))
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
 
 
 
    return Msg.wParam;
}
 
BOOL CALLBACK MyEnum(HWND hWnd,LPARAM lParam)
{
    TCHAR  WindowText [255]; TCHAR str [255] ;
    GetWindowText(hWnd, (LPWSTR)WindowText, 255);
    GetClassName(hWnd,(LPWSTR)str,255);
    SendMessage(ListBox1,LB_ADDSTRING,0,(LPARAM)str);
    SendMessage(ListBox1,LB_ADDSTRING,0,(LPARAM)WindowText);
 
    // добавление str в массив
    data.push_back(str);
    // добавление  WindowText в массив
    data.push_back(WindowText);
    return true;
 }
 
LRESULT CALLBACK HelloWorldWndProc(HWND hWnd,UINT Message,UINT wParam,LONG lParam)
{
    switch(Message)
    {
    case WM_DESTROY:
        {
        PostQuitMessage(0);
        }break;
    case WM_LBUTTONDOWN:
        EnumWindows(MyEnum, 0);
        break;
    case WM_RBUTTONDOWN:
        hw=FindWindow(TEXT("Класс получателя"),TEXT("Получатель"));
        if(hw)
        {MessageBox(NULL, L"Получатель найден", L"Нету ошибки", MB_OK);
    //отправка сообщения
    SendMessage(hw,WM_COPYDATA,(WPARAM)hWnd,(LPARAM)&p);
        }
        else 
        {MessageBox(NULL, L"Получатель не найден", L"Ошибка", MB_OK);
        }
        break;
    /*case WM_CREATE:
        {
 //создание listbox-a
ListBox1=CreateWindowEx(0,L"listbox",0,WS_VISIBLE|WS_CHILD|WS_VSCROLL|WS_BORDER|WS_HSCROLL,50,50,200,500,hWnd,0,0,0);
        }break;*/
        return 0;
    }
    return DefWindowProc(hWnd,Message,wParam,lParam);
}



Вот 2-я программа:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
#include <windows.h> 
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
void myFunc(TCHAR* str);
 
vector<TCHAR*>* data;   //данные ,которые будут получены
 
HWND ListBox1; //дескриптор списка
COPYDATASTRUCT *pc;
 
// Главная функция:
int WINAPI WinMain(HINSTANCE hInst, 
                   HINSTANCE hPrevInst, 
                   LPSTR lpCmdLine,
                   int nCmdShow) 
{
    
    HWND hMainWnd; // создаём дескриптор будущего окошка
    MSG msg;
    WNDCLASSEX wc; // создаём экземпляр, для обращения к членам класса WNDCLASSEX
    wc.cbSize        = sizeof(wc); 
    wc.style         = CS_HREDRAW | CS_VREDRAW|CS_DBLCLKS; 
    wc.lpfnWndProc   = WndProc;
    wc.lpszMenuName  =  0; 
    wc.lpszClassName = L"Класс получателя"; 
    wc.cbWndExtra    = NULL; 
    wc.cbClsExtra    = NULL; 
    wc.hIcon         = LoadIcon(NULL, IDI_WINLOGO); 
    wc.hIconSm       = LoadIcon(NULL, IDI_WINLOGO); 
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 
    wc.hInstance     = hInst; 
    if(!RegisterClassEx(&wc)){
       
        MessageBox(NULL, L"Не получилось зарегистрировать класс!", L"Ошибка", MB_OK);
        return NULL; 
    }
    // Функция, создающая окошко:
    hMainWnd = CreateWindow(L"Класс получателя",L"Получатель",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
        CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL);
    if(!hMainWnd){
   
        MessageBox(NULL, L"Не получилось создать окно!", L"Ошибка", MB_OK);
        return NULL;
    }
    ShowWindow(hMainWnd, nCmdShow);
    UpdateWindow(hMainWnd);
 
    while(GetMessage(&msg, NULL, NULL, NULL)){ 
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam; 
}
 //обратотка сообщений
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 
   switch(uMsg){
    case WM_DESTROY: 
        PostQuitMessage(NULL); 
        break;
    //получение данных
    case WM_COPYDATA:
        pc=(COPYDATASTRUCT*)lParam;
        data=(vector<TCHAR*>*)pc->lpData;  //запись
        for_each(data->begin(), data->end(), myFunc);
        break;
     //создание списка в получателе
     case WM_CREATE:
        {    ListBox1=CreateWindowEx(0,L"listbox",0,WS_VISIBLE|WS_CHILD|WS_VSCROLL|WS_BORDER|WS_HSCROLL,50,50,300,600,hWnd,0,0,0);
        }
        break;
     
 default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam); 
    }
return NULL; 
}
 
void myFunc(TCHAR* str)   //функция для записи в listbox
{
    SendMessage(ListBox1,LB_ADDSTRING,0,(LPARAM)str);
    cout << *str << endl;   
}




Ошибок не выдаёт ничего , но и не хочет работать . 1-я программа 2-ю находит , но ListBox во второй не заполняется всё равно .

Прошу Вас о помощи , так как в тупик зашёл уже . Ещё и то , что ошибок никаких не выдаёт смущает)

Заранее спасибо !
...
Рейтинг: 0 / 0
Функция EnumWindows()
    #38596787
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NNN7,

vector<TCHAR*> data;

так не пойдёт, для передачи через WM_COPYDATA (да и любыми другими способами) нужен просто участок памяти, без всяких коллекций и т п. Просто выделенный через malloc, например.
...
Рейтинг: 0 / 0
Функция EnumWindows()
    #38596856
NNN7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил, вот блин , всё неправильно значит ?
а как его через тот malloc выделять то?
Код: plaintext
1.
2.
TCHAR *data;
data=(TCHAR*)malloc(10*sizeof(TCHAR));



и как тогда в data положить str и WindowText?

с вектором я вот так делал:

Код: plaintext
1.
2.
3.
4.
5.
// добавление str в массив
    data.push_back(str);
    // добавление  WindowText в массив
    data.push_back(WindowText);
    return true;



а теперь как?

Помогите , пожалуйста )
...
Рейтинг: 0 / 0
Функция EnumWindows()
    #38597051
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NNN7,

строковые функции смотри - wcsncat,wcscpy_s,wcsnlen_s и т д

на размер буфера обрати внимание.

чтоб было проще - пустые заголовки не копируй, а рассматривай на принимающем конце пустую строку как конец данных
...
Рейтинг: 0 / 0
23 сообщений из 48, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Функция EnumWindows()
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]