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

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

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

Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

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

Сообщение shade »

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

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

Функция WindowFromPoint возращает 0 (GTK2). Может есть решение непосредственно через xLib ?
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Интересный момент. Я использовал такой код:

Код: Выделить всё

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 = той области где мышь остановилась.
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

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

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

Сообщение VirtUX »

shade писал(а):Вы под Windows или под Linux проверяли?
Linux (QT)
shade писал(а):под QT не пробовал - какой-то библиотеки не хватает для компиляции)
libqt4intf.so лежит на сайте Троллей, если что, могу кинуть на мыло.
Аватара пользователя
Attid
долгожитель
Сообщения: 2589
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

http://users.telenet.be/Jan.Van.hijfte/ ... pcqt4.html
брать версию для Qt 4.3.4
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

Не по теме:
Attid, пожалуйста, поставь жирную точку по теме "Ввод в невидимый TEdit" - баг это или злонамеренность?
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

Ну её-моё!.. пересобрал 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 :(
Logo
постоялец
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Сообщение Logo »

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 - верно?
Andreich
постоялец
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Сообщение Andreich »

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

Если курсор находится над окном родительского приложения, то значение возвращается и под gtk2,... для всех других все равно 0.
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Logo писал(а):У меня не получается откомилировать Lazarus, изменены некоторые функции и выдает ошибки...
У меня с новым QT тоже не компилится
Logo писал(а):VirtUX, помойму у тебя SUSE 11.0
Сейчас сижу на Mandriva 2009.0 pwp и матерюсь громко-громко. Жду выхода openSUSE 11.1 - там будет мое железо поддерживаться. (Не в тему: стабильней openSUSE, наверно, (QNX не в счет) ничего нет)
Logo писал(а):Используем WindowFromPoint из модуля LCLIntf - верно?
Да.
Аватара пользователя
Attid
долгожитель
Сообщения: 2589
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

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

у меня КТ 4,4,0, а вот именно эта библиатека 4.3.4. доблекомандер собирается и работает =) больше ничего не пробывал. весия лазаря свн.
ЗЫ убунту 8,04
Logo
постоялец
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Сообщение Logo »

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 поправят все.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

У меня последний QT 4.4.3 с libqt4intf.dll версии 4.4.2 не компмлируется, а вот установив libqt4intf.dll версии 4.3.4 все прекрастно заработало.
в *nix системах не пробовал.
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

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, а нужно не ноль...

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

Уточню, нам нужен не столько дескриптор окна, сколько его положение и размеры (включая рамку и заголовок). Т.е. нужно узнать экранные координаты прямоугольника.
Logo
постоялец
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Сообщение Logo »

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

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

Понятно, имеем в виду, буду искать. Помойму нужно смотреть конкретно каждый ВиджетСет.
Ответить