0 / 0 / 0
Регистрация: 06.03.2014
Сообщений: 15
1

Обработка нажатия на Button и программное нажатие правой кнопки мыши

17.05.2014, 01:46. Показов 3978. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Разбираюсь в винапи, есть окно с кнопкой, которая должна включать/выключать перемещение курсора и клик мышью в окне. Но возникли пара сложностей, не могу найти в сообщении WM_COMMAND hmenu кнопки. Без проверки на hmenu все срабатывает как надо, с ним - нет. Пробовал и LOWORD(), и HIWORD(), даже с lparam и вручную:
C++
1
2
3
4
5
case WM_COMMAND:
    if (LOWORD(wparam) == BTN){
        // ничего не выполняется
    }
    break;
Другая же проблема - не отправляются сообщения правого клика мышью в заданное окно (0 я тоже пробовал), курсор ставится в нужное место, но правого клика нет:
C++
1
2
3
4
5
6
7
8
9
int lp;
srand(time(0));
lp = (rand() * 23 % 1080) << 16;
lp = lp + (rand() * 17 % 1920);
SetCursorPos(lp & 0xFFFF, lp >> 16);
Sleep(255);
SendMessage(hwndFound, WM_RBUTTONDOWN, MK_RBUTTON, lp);
Sleep(200);
SendMessage(hwndFound, WM_RBUTTONUP, MK_RBUTTON, lp);
На всякий случай CreateWindow() buttona:
C++
1
2
3
4
5
6
7
8
9
10
11
12
btn = CreateWindowEx(
    0,
    L"button",
    L"Go",
    WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
    0, 0,
    width, height,
    hwnd,
    (HMENU)BTN,
    hInst,
    0
);
Добавлено через 1 час 51 минуту
BTN - макрос, заменяется числом, наклацаным случайным образом
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.05.2014, 01:46
Ответы с готовыми решениями:

Программное нажатие левой кнопки мыши
Господа, кто нить подскажет как можно заставить программу нажимать левую кнопку мыши. Пробовал...

Программное нажатие на левую и правую кнопку мыши
как програмно нажать левую и правую клавишу мыши?

Взаимосвязь правой кнопки мыши с функцией getch
Доброго времени суток! Перед тем, как описать суть проблемы, небольшой ввод: в своем проекте...

Действия при нажатии левой(правой) кнопки мыши в рабочей области окна
Нужно Написать Win32API. Что бы правая и левая кнопка мыши выполняли действия написанные в...

9
Заблокирован
17.05.2014, 06:20 2
послушай, в дефолтной проекте из VS уже всё реализовано, в конкретно твой вопрос?
Давай сделаем так - ты соблаговолишь запустить стандартный проект из VS и если останутся вопросы - ты укажешь на конкретную строку и скажешь - "вот тут какой - то косяк с WinApi" :-)
0
2 / 2 / 3
Регистрация: 28.05.2013
Сообщений: 28
17.05.2014, 14:48 3
Что касается кнопки:
теоретически все верно.
Только обычно принято оформлять обработку WM_COMMAND не через if, а через switch.
C++
1
2
3
4
5
6
7
case WM_COMMAND:
    switch(LOWORD(wparam)){
        case BTN:
            //Действие
            break;
        }
        break;
Не совсем понял, что с макросой.
Объясни точнее, как она определяется.
0
0 / 0 / 0
Регистрация: 06.03.2014
Сообщений: 15
17.05.2014, 16:49  [ТС] 4
newbie666, что это за дефолтный проект? Там вроде ничего такого нет
egorus99, значение макроса получено методом тыка по клавиатуре. Про свитч я понял, учту.
0
2 / 2 / 3
Регистрация: 28.05.2013
Сообщений: 28
18.05.2014, 13:56 5
Все равно мне кажется, что виноват макрос...
Скиньте весь код программы, или скиньте проект в архиве.
0
0 / 0 / 0
Регистрация: 06.03.2014
Сообщений: 15
18.05.2014, 19:13  [ТС] 6
egorus99,
Кликните здесь для просмотра всего текста
Код
#define BTN 239875
#define MAIN 13948534

#include <windows.h>
#include <cstdlib>
#include <ctime>

HWND hwndFound, hwnd, btn;

LRESULT CALLBACK MainProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
void Start();

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
	WNDCLASSEX wcx;
	int width, height;
	MSG msg;
	RECT srect;

	GetWindowRect(GetDesktopWindow(), &srect);
	width = srect.right;
	height = srect.bottom;

	wcx.cbSize = sizeof(WNDCLASSEX);
	wcx.style = CS_HREDRAW | CS_VREDRAW;
	wcx.lpfnWndProc = MainProc;
	wcx.cbClsExtra = 0;
	wcx.cbWndExtra = 0;
	wcx.hInstance = hInst;
	wcx.hIcon = 0;
	wcx.hCursor = 0;
	wcx.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wcx.lpszMenuName = 0;
	wcx.lpszClassName = L"classname";
	wcx.hIconSm = 0;

	if (!RegisterClassEx(&wcx)){
		MessageBox(0, L"!", L"RegisterClass failed", 0);
		return 1;
	}

	hwnd = CreateWindowEx(
		0,
		L"classname",
		L"Off",
		WS_SYSMENU | WS_MINIMIZEBOX,
		width / 2 - 112,
		height / 2 - 40,
		224,
		80,
		0,
		0,
		hInst,
		0
	);

	if (!hwnd){
		MessageBox(0, L"!", L"CreateWindow failed", 0);
		return 1;
	}

	GetClientRect(hwnd, &srect);
	width = srect.right;
	height = srect.bottom;

	btn = CreateWindowEx(
		0,
		L"button",
		L"Go",
		WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
		0, 0,
		width, height,
		hwnd,
		(HMENU)BTN,
		hInst,
		0
	);

	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);

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

	return 0;
}

LRESULT CALLBACK MainProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp){
	switch (msg){
	case WM_COMMAND:
		switch (LOWORD(wp)){
		case BTN:
			// ничего не выполняется
			hwndFound = FindWindow(0, L"Name");
			if (!hwndFound){
				MessageBox(0, L"Cannot find window by name", L"!", 0);
				break;
			}
			
			SetWindowText(hwnd, L"On");
			SetWindowText(btn, L"In progress");
			EnableWindow(btn, false);
			Start();
			
			break;
		}
		break;

	case WM_DESTROY:
		PostQuitMessage(0);
		break;

	default:
		return DefWindowProc(hwnd, msg, wp, lp);
	}

	return 0;
}

void Start(){
	int lp;
	
	Sleep(3500);
	srand(time(0));
	lp = (rand() * 23 % 1080) << 16;
	lp = lp + (rand() * 17 % 1920);
	SetCursorPos(lp & 0xFFFF, lp >> 16);
	Sleep(255);
	SendMessage(hwndFound, WM_RBUTTONDOWN, MK_RBUTTON, lp);
	Sleep(200);
	SendMessage(hwndFound, WM_RBUTTONUP, MK_RBUTTON, lp);
	SetWindowText(hwnd, L"Off");
	SetWindowText(btn, L"Go");
	EnableWindow(btn, true);
}
0
Brainsbreaker
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
19.05.2014, 01:44 7
#define BTN (239875-174340) для начала.
0
2 / 2 / 3
Регистрация: 28.05.2013
Сообщений: 28
19.05.2014, 07:50 8
Видимо, какое-то ограничение в размере id.
Поставил значение 1000 - стал видеть. Правда, стало появляться окно "Cannot find window by name". Но это уже другая проблема.
0
0 / 0 / 0
Регистрация: 06.03.2014
Сообщений: 15
19.05.2014, 11:04  [ТС] 9
Да, все дело оказалось в размере числа. Странно что о содержимом структуры в интернете ничего нет.
0
22 / 4 / 0
Регистрация: 16.04.2007
Сообщений: 70
07.11.2016, 20:22 10
Ответ я вроде только что раскопал по схожей теме, на оверфлоуне его черканул: http://stackoverflow.com/quest... 5#40470665
0
07.11.2016, 20:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.11.2016, 20:22
Помогаю со студенческими работами здесь

Нажатие левой кнопки мыши
господа создаю основное окно , а затем с этим же классом создаю дочернее окно вот так #include...

Как получить кординаты нажатия кнопки мыши?
Подскажите как получить кординаты нажатия кнопки мыши??

Обработка нажатия правой кнопки мыши
Вопрос по сабжу. Как реализовать на компоненте TPanel?

Запрет нажатия правой кнопки мыши
Никак не могу запретить по клику на ссылке запретить появдяться стандартную виндовую менюшку.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru