Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.093 c
2-1274084890
REX
2010-05-17 12:28
2010.08.27
метод ExecSQL (компонент ADOQuery)


15-1271018147
@!!ex
2010-04-12 00:35
2010.08.27
Lab степень отличия цветов друг от друга


15-1268240454
БарЛог
2010-03-10 20:00
2010.08.27
Что-то вроде УПС, но на короткое время


2-1272882198
Раиса
2010-05-03 14:23
2010.08.27
DataType - какой для double?


15-1265037576
TStas
2010-02-01 18:19
2010.08.27
Что за файлы с расширением GID?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский