Как найти окно?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как найти окно?

Сообщение shade » 28.10.2008 22:12:41

Решил в отдельной теме спросить (начало тут viewtopic.php?f=5&t=3784 )

Как найти окно под курсором мыши?
Собственно нужно найти не столько само окно, сколько его координаты и размеры (включая рамку и заголовок).

Функция WindowFromPoint возращает 0 (GTK2). Может есть решение непосредственно через xLib ?
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Re: Как найти окно?

Сообщение VirtUX » 29.10.2008 10:28:35

Интересный момент. Я использовал такой код:
Код: Выделить всё
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Form1.Caption:= IntToStr(WindowFromPoint(Mouse.CursorPos));
end;
и соответственно
Код: Выделить всё
procedure TForm2.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Form2.Caption:= IntToStr(WindowFromPoint(Mouse.CursorPos));
end;
Над Form1 результат = -1235001328, а над Form2 -1235001024.
Но! Если мышь перемещать быстро (т.е. дергать), то результат может быть равным нулю при перемещении курсора за окна приложения или HWND того окна на которое попал курсор.
Вот такой цирк. При медленном движении мыши все ОК, а при быстром HWND = той области где мышь остановилась.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Как найти окно?

Сообщение shade » 29.10.2008 11:54:01

VirtUX
Вы под Windows или под Linux проверяли?
Я пробовал даже вообще не двигать мышкой, всё равно возвращает ноль :(

Я тестировал под Linux и меня интересует решение именно под Linux, т.к. под Windows проблема уже решена.
(пробовал под GTK2, под QT не пробовал - какой-то библиотеки не хватает для компиляции)
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Re: Как найти окно?

Сообщение VirtUX » 29.10.2008 17:20:57

shade писал(а):Вы под Windows или под Linux проверяли?
Linux (QT)
shade писал(а):под QT не пробовал - какой-то библиотеки не хватает для компиляции)
libqt4intf.so лежит на сайте Троллей, если что, могу кинуть на мыло.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Как найти окно?

Сообщение Attid » 29.10.2008 17:29:38

http://users.telenet.be/Jan.Van.hijfte/ ... pcqt4.html
брать версию для Qt 4.3.4
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: Как найти окно?

Сообщение Владимир » 29.10.2008 23:24:54

Не по теме:
Attid, пожалуйста, поставь жирную точку по теме "Ввод в невидимый TEdit" - баг это или злонамеренность?
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Как найти окно?

Сообщение shade » 30.10.2008 00:40:35

Ну её-моё!.. пересобрал Lazarus под QT, проверил...
Код: Выделить всё
procedure TForm1.Timer1Timer(Sender: TObject);
var w: longint;
begin
  Timer1.Enabled:= false;
  w := WindowFromPoint(Mouse.CursorPos);
  showMessage( IntToStr(w) );
end;   


млин, слов нет, если курсор над окном того же приложения, то возращает значение, если над окном чужого приложения, то возращает 0
так и в QT и в GTK :(
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Re: Как найти окно?

Сообщение Logo » 30.10.2008 01:29:13

Attid писал(а):http://users.telenet.be/Jan.Van.hijfte/qtforfpc/fpcqt4.html
брать версию для Qt 4.3.4

Attid, ты работал на QT 4.3.4 ?
У меня не получается откомилировать Lazarus, изменены некоторые функции и выдает ошибки... Разбираться пока не пробовал из за недостатка времени. Или это я, что-то криво делаю :oops:

Добавлено спустя 7 минут 50 секунд:
To VirtUX.
VirtUX, помойму у тебя SUSE 11.0, а какая версия QT? Подскажи, пожалуйста. У меня обновлено до 4.3.4 и Lazarus отказывается компилироваться под QT, libqt4intf.so 4.3.4 брал готовый и сам компилировал, - все тоже.

Добавлено спустя 35 минут 11 секунд:
По поводу определения окна
У меня определяет хандл четко, без нулей и минусов.
Ось SUSE 11.0, GTK-2, x86_64, RAM 2Gb, Маус оптический мицуми совсем простой.
Определяются как отдельные окна, так и TWinСontrol`s на окнах.

Используем WindowFromPoint из модуля LCLIntf - верно?
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Как найти окно?

Сообщение Andreich » 30.10.2008 05:29:21

shade писал(а):если курсор над окном того же приложения, то возращает значение, если над окном чужого приложения, то возращает 0
так и в QT и в GTK

Если курсор находится над окном родительского приложения, то значение возвращается и под gtk2,... для всех других все равно 0.
Andreich
постоялец
 
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Re: Как найти окно?

Сообщение VirtUX » 30.10.2008 10:30:55

Logo писал(а):У меня не получается откомилировать Lazarus, изменены некоторые функции и выдает ошибки...
У меня с новым QT тоже не компилится
Logo писал(а):VirtUX, помойму у тебя SUSE 11.0
Сейчас сижу на Mandriva 2009.0 pwp и матерюсь громко-громко. Жду выхода openSUSE 11.1 - там будет мое железо поддерживаться. (Не в тему: стабильней openSUSE, наверно, (QNX не в счет) ничего нет)
Logo писал(а):Используем WindowFromPoint из модуля LCLIntf - верно?
Да.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Как найти окно?

Сообщение Attid » 30.10.2008 12:44:13

Logo писал(а):Attid, ты работал на QT 4.3.4 ?

у меня КТ 4,4,0, а вот именно эта библиатека 4.3.4. доблекомандер собирается и работает =) больше ничего не пробывал. весия лазаря свн.
ЗЫ убунту 8,04
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: Как найти окно?

Сообщение Logo » 30.10.2008 12:52:37

Attid писал(а):у меня КТ 4,4,0, а вот именно эта библиатека 4.3.4. доблекомандер собирается и работает =) больше ничего не пробывал. весия лазаря свн.
ЗЫ убунту 8,04

Спасибо, буду пробовать.

Добавлено спустя 8 минут 33 секунды:
VirtUX писал(а):Сейчас сижу на Mandriva 2009.0 pwp и матерюсь громко-громко. Жду выхода openSUSE 11.1 - там будет мое железо поддерживаться. (Не в тему: стабильней openSUSE, наверно, (QNX не в счет) ничего нет)

Я еще не помню такой глючной сборки от Мандривы, как 2009.0. Хотя под Гномом работает нормально, но мне сейчас нужен QT. Ты прав, на данный момент SUSE с KDE-4 наиболее работоспособная. Есть недочеты, но с ними можно мириться. В Мандриве наоборот, много хороших вещей, но недостатки на нет сводят все достоинства. Видимо в 2009.1 поправят все.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Как найти окно?

Сообщение Mr.Smart » 30.10.2008 15:24:16

У меня последний QT 4.4.3 с libqt4intf.dll версии 4.4.2 не компмлируется, а вот установив libqt4intf.dll версии 4.3.4 все прекрастно заработало.
в *nix системах не пробовал.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Как найти окно?

Сообщение shade » 30.10.2008 18:06:10

Logo писал(а):VirtUX, помойму у тебя SUSE 11.0, а какая версия QT? Подскажи, пожалуйста. У меня обновлено до 4.3.4 и Lazarus отказывается компилироваться под QT, libqt4intf.so 4.3.4 брал готовый и сам компилировал, - все тоже.

У меня OpenSUSE 11.0, чтобы собрать qt4pas-V1.66_Qt4.4.2 пришлось подправить файл compile_lib.bash

Код: Выделить всё
#!/bin/env bash
# get latest from http://users.telenet.be/Jan.Van.hijfte/qtforfpc/fpcqt4.html
# for more info, you can visit the links on above page to FreePascal and Lazarus wiki

# download corresponding qt source
# unpack qt source -> the created directory (Qt4 dir) will be used below
# do configure and gmake in that Qt4 dir

#export QT4=/usr/lib/qt4
export QT4=/usr
export QT4I=$QT4/include
export LD_LIBRARY_PATH=$QT4/lib
if [ -e "$LD_LIBRARY_PATH/libQtCore.so" ]
then
  g++ -D BINUX -I. -I$QT4I -I$QT4I/Qt -I$QT4I/QtGui -I$QT4I/QtCore -Iqlcl qtpas.cpp -o libqt4intf.so -shared -fPIC /usr/lib/libQtCore.so /usr/lib/libQtGui.so  -Xlinker "-soname=libqt4intf.so"
  strip --strip-all libqt4intf.so
else
  echo "Please Modify location of Qt4 in this script"
fi


потом
$ bash compile_lib.bas
и всё собирается

c 4.3.4 лазарус собираться отказался, каких-то функций не нашел...

Добавлено спустя 19 минут 18 секунд:
Logo писал(а):По поводу определения окна
У меня определяет хандл четко, без нулей и минусов.
Ось SUSE 11.0, GTK-2, x86_64, RAM 2Gb, Маус оптический мицуми совсем простой.
Определяются как отдельные окна, так и TWinСontrol`s на окнах.


А вот у меня почему-то нет :(

1. качаем архивчик с тестовым проектом: http://shamangrad.net/tmp/findwnd.tar.bz2
2. компилируем и запускам
3. нажимем button1, наводим курор над формой Form1 и ждем - получаем ShowMessage и с числом <> 0
4. нажимем button1, наводим курор на любое другое окно и ждем - получаем ShowMessage и с числом 0, а нужно не ноль...

т.е. фактически получается поймать только окна своего приложения. а поймать окна других приложений не получается. А нужно поймать окно именно чужого приложения (см. тут)

Уточню, нам нужен не столько дескриптор окна, сколько его положение и размеры (включая рамку и заголовок). Т.е. нужно узнать экранные координаты прямоугольника.
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Re: Как найти окно?

Сообщение Logo » 30.10.2008 22:03:28

shade писал(а):т.е. фактически получается поймать только окна своего приложения. а поймать окна других приложений не получается. А нужно поймать окно именно чужого приложения (см. тут)

Уточню, нам нужен не столько дескриптор окна, сколько его положение и размеры (включая рамку и заголовок). Т.е. нужно узнать экранные координаты прямоугольника.

Понятно, имеем в виду, буду искать. Помойму нужно смотреть конкретно каждый ВиджетСет.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru