Как найти окно?
Модератор: Модераторы
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
Как найти окно?
Решил в отдельной теме спросить (начало тут viewtopic.php?f=5&t=3784 )
Как найти окно под курсором мыши?
Собственно нужно найти не столько само окно, сколько его координаты и размеры (включая рамку и заголовок).
Функция WindowFromPoint возращает 0 (GTK2). Может есть решение непосредственно через xLib ?
Как найти окно под курсором мыши?
Собственно нужно найти не столько само окно, сколько его координаты и размеры (включая рамку и заголовок).
Функция WindowFromPoint возращает 0 (GTK2). Может есть решение непосредственно через xLib ?
Интересный момент. Я использовал такой код:
и соответственно
Над Form1 результат = -1235001328, а над Form2 -1235001024.
Но! Если мышь перемещать быстро (т.е. дергать), то результат может быть равным нулю при перемещении курсора за окна приложения или HWND того окна на которое попал курсор.
Вот такой цирк. При медленном движении мыши все ОК, а при быстром HWND = той области где мышь остановилась.
Код: Выделить всё
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;Но! Если мышь перемещать быстро (т.е. дергать), то результат может быть равным нулю при перемещении курсора за окна приложения или HWND того окна на которое попал курсор.
Вот такой цирк. При медленном движении мыши все ОК, а при быстром HWND = той области где мышь остановилась.
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
VirtUX
Вы под Windows или под Linux проверяли?
Я пробовал даже вообще не двигать мышкой, всё равно возвращает ноль
Я тестировал под Linux и меня интересует решение именно под Linux, т.к. под Windows проблема уже решена.
(пробовал под GTK2, под QT не пробовал - какой-то библиотеки не хватает для компиляции)
Вы под Windows или под Linux проверяли?
Я пробовал даже вообще не двигать мышкой, всё равно возвращает ноль
Я тестировал под Linux и меня интересует решение именно под Linux, т.к. под Windows проблема уже решена.
(пробовал под GTK2, под QT не пробовал - какой-то библиотеки не хватает для компиляции)
Linux (QT)shade писал(а):Вы под Windows или под Linux проверяли?
libqt4intf.so лежит на сайте Троллей, если что, могу кинуть на мыло.shade писал(а):под QT не пробовал - какой-то библиотеки не хватает для компиляции)
- Attid
- долгожитель
- Сообщения: 2589
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
http://users.telenet.be/Jan.Van.hijfte/ ... pcqt4.html
брать версию для Qt 4.3.4
брать версию для Qt 4.3.4
Не по теме:
Attid, пожалуйста, поставь жирную точку по теме "Ввод в невидимый TEdit" - баг это или злонамеренность?
Attid, пожалуйста, поставь жирную точку по теме "Ввод в невидимый TEdit" - баг это или злонамеренность?
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
Ну её-моё!.. пересобрал Lazarus под QT, проверил...
млин, слов нет, если курсор над окном того же приложения, то возращает значение, если над окном чужого приложения, то возращает 0
так и в QT и в GTK
Код: Выделить всё
procedure TForm1.Timer1Timer(Sender: TObject);
var w: longint;
begin
Timer1.Enabled:= false;
w := WindowFromPoint(Mouse.CursorPos);
showMessage( IntToStr(w) );
end;
млин, слов нет, если курсор над окном того же приложения, то возращает значение, если над окном чужого приложения, то возращает 0
так и в QT и в GTK
Attid писал(а):http://users.telenet.be/Jan.Van.hijfte/qtforfpc/fpcqt4.html
брать версию для Qt 4.3.4
Attid, ты работал на QT 4.3.4 ?
У меня не получается откомилировать Lazarus, изменены некоторые функции и выдает ошибки... Разбираться пока не пробовал из за недостатка времени. Или это я, что-то криво делаю
Добавлено спустя 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 - верно?
shade писал(а):если курсор над окном того же приложения, то возращает значение, если над окном чужого приложения, то возращает 0
так и в QT и в GTK
Если курсор находится над окном родительского приложения, то значение возвращается и под gtk2,... для всех других все равно 0.
У меня с новым QT тоже не компилитсяLogo писал(а):У меня не получается откомилировать Lazarus, изменены некоторые функции и выдает ошибки...
Сейчас сижу на Mandriva 2009.0 pwp и матерюсь громко-громко. Жду выхода openSUSE 11.1 - там будет мое железо поддерживаться. (Не в тему: стабильней openSUSE, наверно, (QNX не в счет) ничего нет)Logo писал(а):VirtUX, помойму у тебя SUSE 11.0
Да.Logo писал(а):Используем WindowFromPoint из модуля LCLIntf - верно?
- Attid
- долгожитель
- Сообщения: 2589
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
Logo писал(а):Attid, ты работал на QT 4.3.4 ?
у меня КТ 4,4,0, а вот именно эта библиатека 4.3.4. доблекомандер собирается и работает =) больше ничего не пробывал. весия лазаря свн.
ЗЫ убунту 8,04
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 поправят все.
У меня последний QT 4.4.3 с libqt4intf.dll версии 4.4.2 не компмлируется, а вот установив libqt4intf.dll версии 4.3.4 все прекрастно заработало.
в *nix системах не пробовал.
в *nix системах не пробовал.
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
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 писал(а):т.е. фактически получается поймать только окна своего приложения. а поймать окна других приложений не получается. А нужно поймать окно именно чужого приложения (см. тут)
Уточню, нам нужен не столько дескриптор окна, сколько его положение и размеры (включая рамку и заголовок). Т.е. нужно узнать экранные координаты прямоугольника.
Понятно, имеем в виду, буду искать. Помойму нужно смотреть конкретно каждый ВиджетСет.
