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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2013, 17:19   #11
Angelochek*
Пользователь
 
Регистрация: 26.09.2013
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Vladiger Посмотреть сообщение
Тогда ещё время нажатия может играть роль, попробуй
Код:
PostMessage(hwnd1, WM_LBUTTONDOWN, MK_LBUTTON, MakeLParam(i, j));
Sleep(500);
PostMessage(hwnd1, WM_LBUTTONUP, 0, MakeLParam(i, j));
Тоже самое, просто выделяется. Пробывал и с задержкой 200 и 3000 и без задержки.

Цитата:
Сообщение от waleri Посмотреть сообщение
А координаты относительно чего? Окна или экрана?
Окна, вот так:
Код:
 bit.Width := 1024;
 bit.Height := 768;
hwnd1:=FindWindow(nil, PChar(ComboBox1.Text));
BitBlt(bit.Canvas.Handle, 0, 0, Width, Height, GetDC(hwnd1), 0, 0,SRCCOPY );
   Label2.Caption:='';
for i:=0 to bit.Width do begin
  for j:=0 to bit.Height do
    if bit.Canvas.Pixels[i,j]=p then begin
         Label2.Caption:='Пиксель найден';
       flag:=true;
       break;
    end;
if flag then
  break;
Цитата:
Сообщение от Vladiger Посмотреть сообщение
Как вариант можно просто програмно эмулировать нажатие клавиш клавиатуры или мыши функциями keybd_event() или mouse_event().
Это работает. А как сделать клик этой функцией mouse_event() в нужные координаты без SetCursorPos(x,y) какой должен быть код?

Последний раз редактировалось Stilet; 03.11.2013 в 19:36.
Angelochek* вне форума Ответить с цитированием
Старый 20.10.2013, 20:41   #12
Vladiger
Пользователь
 
Регистрация: 31.08.2013
Сообщений: 93
По умолчанию

Цитата:
Сообщение от Angelochek* Посмотреть сообщение
А как сделать клик этой функцией mouse_event() в нужные координаты без SetCursorPos(x,y) какой должен быть код?
А почему без SetCursorPos(x,y)?
Я понимаю что x и y это координаты относительно окна, а не всей области Desktop. Но это же не проблема: - Имея hWnd окна, получаем его размеры и положение на экране и просто добавляем к координатам x и y смещение, устанавливая при этом курсор в нужное место.

Код:
#include <windows.h>
#include <iostream>

using namespace std;

HWND hWnd;
RECT rcWindow;

void MouseClick(int x, int y) {
	SetCursorPos(rcWindow.left + x, rcWindow.top + y);
	mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
	Sleep(50);
	mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
}

int main() {
	hWnd = FindWindow(L"SphereWclName", NULL);
	if (hWnd == NULL) {
		cout << "Window not found!" << endl;
		system("pause");
		return 1;
	}

	GetWindowRect(hWnd, &rcWindow);
	SetForegroundWindow(hWnd);
	while(hWnd != GetForegroundWindow()) Sleep(100);
	
	MouseClick(370, 355);

	return 0;
}
Но опять таки, это будет работать только в активном окне. Если быть более точнее, то функция mouse_event() эмулирует нажатие кнопки мыши, но при этом ей без разницы на что она кликнет, на ваше окно или на окно другой программы. По этому контроль активного окна в момент клика, Вам придется делать самому. В свернутом/неактивном окне - это в любом случае работать не будет.

PS Сорри что на C++, с делфи я просто не знаком, но код простой, думаю разберетесь, перепишете на Delphi

Последний раз редактировалось Vladiger; 20.10.2013 в 20:44.
Vladiger вне форума Ответить с цитированием
Старый 20.10.2013, 23:42   #13
Angelochek*
Пользователь
 
Регистрация: 26.09.2013
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Vladiger Посмотреть сообщение
А почему без SetCursorPos(x,y)?
Я понимаю что x и y это координаты относительно окна, а не всей области Desktop. Но это же не проблема: - Имея hWnd окна, получаем его размеры и положение на экране и просто добавляем к координатам x и y смещение, устанавливая при этом курсор в нужное место.

Код:
#include <windows.h>
#include <iostream>

using namespace std;

HWND hWnd;
RECT rcWindow;

void MouseClick(int x, int y) {
	SetCursorPos(rcWindow.left + x, rcWindow.top + y);
	mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
	Sleep(50);
	mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
}

int main() {
	hWnd = FindWindow(L"SphereWclName", NULL);
	if (hWnd == NULL) {
		cout << "Window not found!" << endl;
		system("pause");
		return 1;
	}

	GetWindowRect(hWnd, &rcWindow);
	SetForegroundWindow(hWnd);
	while(hWnd != GetForegroundWindow()) Sleep(100);
	
	MouseClick(370, 355);

	return 0;
}
Но опять таки, это будет работать только в активном окне. Если быть более точнее, то функция mouse_event() эмулирует нажатие кнопки мыши, но при этом ей без разницы на что она кликнет, на ваше окно или на окно другой программы. По этому контроль активного окна в момент клика, Вам придется делать самому. В свернутом/неактивном окне - это в любом случае работать не будет.

PS Сорри что на C++, с делфи я просто не знаком, но код простой, думаю разберетесь, перепишете на Delphi
Спасибо за код, я понял что эта функция по всему рабочему столу кликает. Я имел в виду можно ли кликнуть по координатам чтобы физически курсор не переместился а оставался на том месте где я сам его в последний раз оставил.
Angelochek* вне форума Ответить с цитированием
Старый 21.10.2013, 00:33   #14
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от Angelochek* Посмотреть сообщение
можно ли кликнуть по координатам чтобы физически курсор не переместился а оставался на том месте где я сам его в последний раз оставил.
Напрямую - нет. Надо переместить курсор, кликнуть и вернуть его обратно.
waleri вне форума Ответить с цитированием
Старый 03.11.2013, 18:28   #15
ZahAlex
Пользователь
 
Регистрация: 08.04.2009
Сообщений: 45
По умолчанию подобная проблема

Всем доброго времени суток! С кликами проблем нет, а вот сделать окно на переднем плане и активным работает только если окно свернуто (ShowWindow) , но если окно просто на заднем плане, это не работает. Посоветуйте как по любому выкинуть окно на передний план?
После изучения ассемблера стал мозг зависать...
ZahAlex вне форума Ответить с цитированием
Старый 03.11.2013, 18:53   #16
Vladiger
Пользователь
 
Регистрация: 31.08.2013
Сообщений: 93
По умолчанию

SetForegroundWindow(hWnd);

Но это срабатывает не всегда. Если речь про окна с обычными стилями по умолчанию, то это работает. Но если в процессах есть активное окно с расширенным стилем, например WS_EX_TOPMOST (поверх всех окон) то выдергивание окна SetForegroundWindow(hWnd) приводит к непонятным результатам. окно вроде бы становится активным, а вроде бы и нет. В WinXP например у меня были такие траблы, попытка выдернуть окно на передний план, заканчивалась тем что в панели быстрого запуска это окно просто начинало моргать синеньким квадратиком.
Пытался что нибудь нагуглить по этому поводу, но так толком и не нашел "разумного" решения, непонятное поведение.

Самый надежный вариант - это свернуть и сразу развернуть окно:
Код:
ShowWindow(hWnd, SW_MINIMIZE);
Sleep(500);
ShowWindow(hWnd, SW_RESTORE);
Работает безотказно, но как то это уж слишком грубо...
Vladiger вне форума Ответить с цитированием
Старый 03.11.2013, 19:01   #17
ZahAlex
Пользователь
 
Регистрация: 08.04.2009
Сообщений: 45
По умолчанию

А если оно уже свернуто, есть способ узнать его статус. Просто это тоже бывает глючит, причем при первом запуске моей проги почти всегда
После изучения ассемблера стал мозг зависать...
ZahAlex вне форума Ответить с цитированием
Старый 03.11.2013, 19:11   #18
Vladiger
Пользователь
 
Регистрация: 31.08.2013
Сообщений: 93
По умолчанию

Цитата:
Сообщение от ZahAlex Посмотреть сообщение
А если оно уже свернуто, есть способ узнать его статус.
Узнаем свернуто окно или развернуто?
Код:
if (IsIconic(hWnd)) {
	// Окно свернуто
} else {
	// Окно развернуто
}
и так же по аналогии определяем развернуто окно или свернуто
Код:
if (IsZoomed(hWnd)) {
	// Окно развернуто
} else {
	// Окно свернуто
}
Собственно функции IsIconic(hWnd) и IsZoomed(hWnd) - это функции близнецы, разница только в противоположности определяемого статуса окна.
Vladiger вне форума Ответить с цитированием
Старый 03.11.2013, 19:37   #19
ZahAlex
Пользователь
 
Регистрация: 08.04.2009
Сообщений: 45
По умолчанию

ну, вот то что надо, если свернуто выдвигаем, если нет сворачиваем и выдвигаем, так думаю надежнее будет и меньше телодвижений с окном. Спасибо.
После изучения ассемблера стал мозг зависать...
ZahAlex вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Установка курсора _-Re@l-_ Общие вопросы Delphi 3 28.05.2010 17:25
задание положения курсора в окне(не full screen)) Oburec Общие вопросы Delphi 1 30.06.2009 00:42
Установка курсора на новую запись в DBGrid Nomiko БД в Delphi 9 24.05.2009 18:40
Установка курсора в определеное место экрана? ALEX_RAS Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 23.05.2008 20:49
Установка собственного курсора Amateur Общие вопросы Delphi 4 13.11.2007 05:42