Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизАктивировать окно при наведении мышкой Найти похожие ветки
← →
Virtus (2010-02-09 15:21) [0]Как реализовать активацию окна, процесс которого называется, к примеру, "process.exe", при наведении мышкой?
Т.е. суть заключается в том, что программа просто висит в трее, в Windows может быть открыто много разных окон различных приложении, но когда наводишь мышкой именно на приложение, процесс которого называется "process.exe" (в диспетчере задач), то это окно сразу же становится активным.
Буду признателен за помощь кодом, т.к. программирование знаю на начальном уровне, и сам наврадли справлюсь.
Спасибо!
← →
DVM © (2010-02-09 18:14) [1]
> но когда наводишь мышкой именно на приложение
На приложение нельзя навести мышку, можно на окно.
> процесс которого называется "process.exe" (в диспетчере
> задач), то это окно сразу же становится активным.
Это надо проделать со своим или чужим окном?
← →
Jeltok (2010-02-09 18:25) [2]>Это надо проделать со своим или чужим окном?
С чужим
← →
Virtus (2010-02-09 18:27) [3]Да, с чужим, правильно :)
← →
Eraser © (2010-02-09 18:43) [4]криво сформулирован вопрос, так и не понял на что наводить надо. но есть подозрение, что это все уже реализовано в win 7.
← →
Leonid Troyanovsky © (2010-02-09 19:10) [5]
> Virtus (09.02.10 15:21)
> Как реализовать активацию окна, процесс которого называется,
> к примеру, "process.exe", при наведении мышкой?
Проще счесть невозвоможным, бо оное противоречит полтитке MS.
See also http://msdn.microsoft.com/en-us/library/ms632668(VS.85).aspx
Подробности в Начинающим.
--
Regards, LVT.
← →
DVM © (2010-02-09 19:48) [6]
> Проще счесть невозвоможным, бо оное противоречит полтитке
> MS.
тем не менее работают 2 способа:
procedure SwitchToThisWindow(hWndSwitchTo: HWND; bRestore: BOOL);
type
TSwitchToThisWindow = procedure(hWndSwitch: HWND; bRestore: BOOL); stdcall;
var
_SwitchToThisWindow: TSwitchToThisWindow;
hUser32ModuleHandle: HMODULE;
begin
hUser32ModuleHandle := GetModuleHandle("user32.dll");
if hUser32ModuleHandle > 0 then
begin
@_SwitchToThisWindow := GetProcAddress(hUser32ModuleHandle, "SwitchToThisWindow");
if Assigned(_SwitchToThisWindow) then
_SwitchToThisWindow(hWndSwitchTo, true);
end;
end;
//------------------------------------------------------------------------------
function ForceForegroundWindow(hWnd: HWND): BOOL;
const
SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
var
OsVerInfo: TOSVersionInfo;
Win32MajorVersion: Integer;
Win32MinorVersion: Integer;
Win32Platform: Integer;
ForegroundThreadID: DWORD;
ThisThreadID: DWORD;
Timeout: DWORD;
begin
OsVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
GetVersionEx(osVerInfo);
Win32MajorVersion := OsVerInfo.dwMajorVersion;
Win32MinorVersion := OsVerInfo.dwMinorVersion;
Win32Platform := OsVerInfo.dwPlatformId;
if IsIconic(hWnd) then ShowWindow(hWnd, SW_RESTORE);
if GetForegroundWindow = hWnd then Result := True
else
begin
if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4)) or
((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and ((Win32MajorVersion > 4) or
((Win32MajorVersion = 4) and (Win32MinorVersion > 0)))) then
begin
Result := False;
ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow, nil);
ThisThreadID := GetWindowThreadPRocessId(hWnd, nil);
if AttachThreadInput(ThisThreadID, ForegroundThreadID, True) then
begin
BringWindowToTop(hWnd);
SetForegroundWindow(hWnd);
AttachThreadInput(ThisThreadID, ForegroundThreadID, False);
Result := (GetForegroundWindow = hWnd);
end;
if not Result then
begin
SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @Timeout, 0);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, nil, SPIF_SENDCHANGE);
BringWindowToTop(hWnd);
SetForegroundWindow(hWnd);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, @Timeout, SPIF_SENDCHANGE);
end;
end
else
begin
BringWindowToTop(hWnd);
SetForegroundWindow(hWnd);
end;
Result := (GetForegroundWindow = hWnd);
end;
end; // End of function ForceForegroundWindow
← →
Virtus (2010-02-09 20:52) [7]>криво сформулирован вопрос
Попробую пересформулировать :)
Программка висит в трее. На рабочем столе может быть открыто куча различных окон различных приложений. К примеру, Фотошоп, пару папок, проигрыватель, пару браузеров. Окна не обязаельно развернуты во весь экран, а, скорее даже, наоборот - видно сразу несколько.
И вот пользователь просто работает себе за компьютером, делает что-то...Но как только курсор мышки оказывается в области окна приложения, к примеру, с название процесса "photoshop.exe" (т.е. над окном Фотошопа), то оно сразу становится активным.
Вроде, более подробно уже нельзя :)
← →
Плохиш © (2010-02-09 22:22) [8]
> Буду признателен за помощь кодом, т.к. программирование
> знаю на начальном уровне, и сам наврадли справлюсь.
Сумма не озвучена.
← →
Демо © (2010-02-10 01:05) [9]1. Получаем дескриптор окна, надо котороым находится курсор (GetCursorPos, WindowFromPoint)
2. Перебираем процессы с окнами, находим нужное, определяем имя процесса.
3. Выполняем SetForegroundWindow.
← →
Игорь Шевченко © (2010-02-10 01:10) [10]Демо © (10.02.10 01:05) [9]
0. Получаем управление
← →
Демо © (2010-02-10 01:12) [11]
> Игорь Шевченко © (10.02.10 01:10) [10]
> Демо © (10.02.10 01:05) [9]
>
> 0. Получаем управление
Таймер.
← →
Демо © (2010-02-10 01:15) [12]
> Игорь Шевченко © (10.02.10 01:10) [10]
Что ты имеешь ввиду? Активировать своё приложение сначала?
← →
Leonid Troyanovsky © (2010-02-10 08:04) [13]
> Демо © (10.02.10 01:15) [12]
>
> > Игорь Шевченко © (10.02.10 01:10) [10]
>
>
> Что ты имеешь ввиду? Активировать своё приложение сначала?
Ну, и это тож, бо только foreground приложению разрешено
делать таковым другое.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2010-02-10 08:12) [14]
> DVM © (09.02.10 19:48) [6]
> тем не менее работают 2 способа:
Первый - пока MS приподзакрыл глаза.
За второй - линчевать, как за любые попытки приложения
втихаря дергать юзеровские настройки.
--
Regards, LVT.
← →
Демо © (2010-02-10 11:11) [15]
> Ну, и это тож, бо только foreground приложению разрешено
> делать таковым другое.
Тоже небольшая проблема.
← →
Virtus (2010-02-10 12:58) [16]Демо, а более подробно не поможете? ;)
P.S. Извиняюсь за настойчивость)
← →
Styx (2010-02-10 14:40) [17]Если я правильно понял, что нужно - оно называется Xmouse.
В Windows от 95 до XP активировалась в TweakUI http://www.microsoft.com/windowsxp/downloads/powertoys/xppowertoys.mspx в свойствах мыши.
← →
Virtus (2010-02-10 14:57) [18]Да, до WinXP можно было через реестр активировать, а вот под вистой уже нет(
← →
Styx (2010-02-10 15:25) [19]Вот тут http://en.wikipedia.org/wiki/Xmouse написано:
The setting is also built into Windows Vista in the Ease of Access Center.
← →
Virtus (2010-02-10 15:35) [20]Скачал и TweakUI, и X-Mouse - там есть задание действий по нажатию на различные кнопки, либо же действия на колёсико. Но там нет задания действия просто при наведении курсора мыши(
На Delphi, я так понимаю, всё это сложно реализовать, получается? :)
← →
Демо © (2010-02-10 15:37) [21]Можно двигаться вот в этом направлении.
Этот код работает для Top-Windows, если на заголовок окон наводить курсор.
Но не со всех уходит нормально.
В частности с FAR не уходит. но это дальше надо думать.
function ForceForeground(const Wnd: HWND): boolean;
//© http://forum.vingrad.ru/users/Alex
var
ForeThreadID, NewThreadID: DWORD;
begin
if GetForegroundWindow <> Wnd then
begin
ForeThreadID:= GetWindowThreadProcessId(GetForegroundWindow, nil);
NewThreadID:= GetWindowThreadProcessId(Wnd, nil);
if ForeThreadID <> NewThreadID then
begin
AttachThreadInput(ForeThreadID, NewThreadID, True);
SetActiveWindow(Wnd);
Result:= SetForegroundWindow(Wnd);
AttachThreadInput(ForeThreadID, NewThreadID, False);
if Result then
Result:= SetForegroundWindow(Wnd);
end
else
Result:= SetForegroundWindow(Wnd);
end
else Result:= True;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
p: TPoint;
h: HWND;
begin
GetCursorPos(p);
h := WindowFromPoint(p);
ForceForeground(Application.Handle);
ForceForeground(h);
end;
← →
Styx (2010-02-10 15:42) [22]
> Но там нет задания действия просто при наведении курсора
> мыши
В TweakUI - "Activation follows mouse"
← →
Virtus (2010-02-10 16:26) [23]Демо, спасибо за наводку.
В принципе, пример пододящий, только проблема с тем, что и само окно программы тоже активируется по кругу таймера. Т.е., работая, скажем, в MS Office или что-нибудь печатая, курсор текста каждый раз будет становится не активным, что неудобно))
Да и хорошо бы было, чтобы программа реагировала только на 1 заданное приложение под процессом "process.exe" :)
← →
GDI+ (2010-02-10 16:45) [24]
> Virtus (09.02.10 15:21)
>
> Как реализовать активацию окна, процесс которого называется,
> к примеру, "process.exe", при наведении мышкой?
> Т.е. суть заключается в том, что программа просто висит
> в трее, в Windows может быть открыто много разных окон различных
> приложении, но когда наводишь мышкой именно на приложение,
> процесс которого называется "process.exe" (в диспетчере
> задач), то это окно сразу же становится активным.
>
> Буду признателен за помощь кодом, т.к. программирование
> знаю на начальном уровне, и сам наврадли справлюсь.
> Спасибо!
За X-Mouse драть розгами.
А вообще через
- SetWindowsHookEx + WH_MOUSE_LL и смотреть координаты текущего положения мыши
или
- SetWindowsHookEx + WH_GETMESSAGE, перехватывать mousemove и смотреть на id окна или процесса которому окно принадлежит.
Если включить Xmouse для всех приложений, то
function CheckStandardMSXMouseEnabled: Boolean;
var
lWndTrack: BOOL;
begin
Result := false;
SystemParametersInfo(SPI_GETACTIVEWINDOWTRACKING, 0, @lWndTrack, 0);
//результат
Result := Result or lWndTrack;
end;
function EnableStandardMSXMouse(Value: Boolean): Boolean;
begin
Result := false;
SystemParametersInfo(SPI_SETACTIVEWINDOWTRACKING, 0, Pointer(Value), SPIF_SENDCHANGE or SPIF_UPDATEINIFILE);
Result := Value;
end;
← →
DVM © (2010-02-12 00:14) [25]
> Leonid Troyanovsky © (10.02.10 08:12) [14]
> Первый - пока MS приподзакрыл глаза.
А он будет жить всегда, т.к. существует проводник которому надо переключать задачи. А выяснить, чем он там переключает не сильно сложно будет.
← →
Игорь Шевченко © (2010-02-12 00:29) [26]
> Т.е., работая, скажем, в MS Office или что-нибудь печатая,
> курсор текста каждый раз будет становится не активным,
> что неудобно))
Ну вот, ты подходишь ближе к просветлению. Еще немного и ты поймешь, что за твою задачу тебя будут убивать медленно и с наслаждением.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.064 c