<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: ControlSend в неактивное окно]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=7754</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=7754&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: ControlSend в неактивное окно».]]></description>
		<lastBuildDate>Sat, 05 Oct 2013 01:42:53 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: ControlSend в неактивное окно]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=75768#p75768</link>
			<description><![CDATA[<p>1. Что делать, если ни WinSpector, ни WindowDetective не показывают вообще никаких сообщений ни для одного окна AkelPad?<br />2. Помогите разобраться с отправкой скролла в активное и не активное окно встроенного в винду просмотрщика .chm файлов (HH):<br />я уже настроил её для всего чего хотел, кроме прокручиваемого списка во вкладке &quot;Указатель&quot; в левой части окна:<br /><span class="postimg"><img src="https://i.imgur.com/KloPaTE.png" alt="https://i.imgur.com/KloPaTE.png" /></span><br />никак не получается сделать так, чтобы этот список прокручивался если окно .chm-просмотрщика неактивно, а пользователь крутит колесом мыши над этим списком.</p><p>Сейчас сделал так (в скрипте присутствуют части и не относящиеся к HH): менять надо только строки 27-28 на else (без if) что-то.</p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;код скрипта</div><div class="fancy_spoiler"><div class="codebox"><pre><code>$WheelUp::
$WheelDown::
    MouseGetPos, m_x, m_y, id, control, 1
    hw_m_target := DllCall(&quot;WindowFromPoint&quot;, &quot;int&quot;, m_x, &quot;int&quot;, m_y)
    WinGetClass, class, ahk_id %id%
    WinGet, id_A, ID, A
    If (class == &quot;Notepad++&quot;) &amp;&amp; (control == &quot;SysTabControl325&quot;)    ; Notepad++: ahk_class Notepad++    tab-bar classNN: SysTabControl325    listener-window classNN: Scintilla1
    {
        ControlGet, properTargetWin, Hwnd,, Scintilla1, ahk_id %id%
        PostMessage, 0x319, 0, (A_ThisHotkey == &quot;$WheelUp&quot;) ? 0x10000 : 0x20000,, ahk_id %properTargetWin%
    }
    Else If (class == &quot;CabinetWClass&quot;) &amp;&amp; (control == &quot;SysTreeView321&quot;)    ; Windows Explorer&#039;s left pane with a tree of folders.
        PostMessage, 0x20A, (A_ThisHotkey == &quot;$WheelUp&quot;) ? 120 &lt;&lt; 16 : -120 &lt;&lt; 16, ( m_y &lt;&lt; 16 )|m_x,, ahk_id %hw_m_target%
    Else If (control == &quot;TSTabCtrlClass1&quot;)    ; Miranda IM, TabSRMM window&#039;s tab-bar classNN: TSTabCtrlClass1    listener-window classNN: RichEdit20W1
    {
        ControlGet, properTargetWin, Hwnd,, RichEdit20W1, ahk_id %id%
        PostMessage, 0x319, 0, (A_ThisHotkey == &quot;$WheelUp&quot;) ? 0x10000 : 0x20000,, ahk_id %properTargetWin%
    }
    Else If (class == &quot;HH Parent&quot;)    ; Windows built-in *.chm (help files) reader.
    {
        If (control == &quot;SysTabControl321&quot;)    ; Left pane&#039;s either tab-bar or 2nd tab&#039;s contents.
        {
            ControlGetPos,, ya,,, SysTabControl321, ahk_id %id%
            WinGetPos,, yb,,, ahk_id %id%
            If (m_y &lt; ya + yb + 20)    ; Hovering tab-bar.
                ControlSend,, % (A_ThisHotkey == &quot;$WheelUp&quot;) ? (&quot;{Ctrl Down}{Shift Down}{Tab}{Shift Up}{Ctrl Up}&quot;) : (&quot;{Ctrl Down}{Tab}{Ctrl Up}&quot;), ahk_id %id%
            Else If (id == id_A)    ; Hovering 2nd tab&#039;s contents when .chm reader&#039;s window is active.
                Send, % (A_ThisHotkey == &quot;$WheelUp&quot;) ? &quot;{WheelUp}&quot; : &quot;{WheelDown}&quot;
        }
        Else
            PostMessage, 0x20A, (A_ThisHotkey == &quot;$WheelUp&quot;) ? 120 &lt;&lt; 16 : -120 &lt;&lt; 16, ( m_y &lt;&lt; 16 )|m_x,, ahk_id %hw_m_target%
    }
    Else If (class == &quot;AkelPad4&quot; &amp;&amp; control == &quot;SysTabControl321&quot;) || (class == &quot;IEFrame&quot; &amp;&amp; control == &quot;DirectUIHWND2&quot;)    ; AkelPad + forgot what else.
        ControlSend,, % (A_ThisHotkey == &quot;$WheelUp&quot;) ? (&quot;{Ctrl Down}{Shift Down}{Tab}{Shift Up}{Ctrl Up}&quot;) : (&quot;{Ctrl Down}{Tab}{Ctrl Up}&quot;), ahk_id %id%
    Else If (id != id_A) &amp;&amp; (class != &quot;Progman&quot;)    ; If the cursor hovers an inactive window (and which is not the desktop) - that inactive window should receive a scrolling event (without the activation of that window).
        PostMessage, 0x20A, (A_ThisHotkey == &quot;$WheelUp&quot;) ? 120 &lt;&lt; 16 : -120 &lt;&lt; 16, ( m_y &lt;&lt; 16 )|m_x,, ahk_id %hw_m_target%
    Else If (id == id_A) || (class == &quot;Progman&quot;)    ; If the cursor hovers the active window or desktop - the regular scrolling event should get sent to the active window.
        Send, % (A_ThisHotkey == &quot;$WheelUp&quot;) ? &quot;{WheelUp}&quot; : &quot;{WheelDown}&quot;
    currOpacity := hwndUnderCursor := x1 := y1 := id := id_A := winClass := maximized := winX1 := winY1 := x2 := y2 := winX2 := winY2 := IDactive := control := key := value := Class := properTargetWin := Hwnd := Height := m_x := m_y := ya := yb := hw_m_target := onTop := procName := XWin := YWin := &quot;&quot;
Return</code></pre></div></div></div>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Sat, 05 Oct 2013 01:42:53 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=75768#p75768</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: ControlSend в неактивное окно]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=65438#p65438</link>
			<description><![CDATA[<p>Ещё вопрос по ControlSend&#039;у.<br />Есть другая часть скрипта, которая позволяет переключаться между вкладками простым прокручиванием колеса над ними в редакторе AkelPad.<br /></p><div class="codebox"><pre><code>#NoEnv			; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input	; Recommended for new scripts due to its superior speed and reliability.

~WheelUp::
MouseGetPos,,,id,control,1
WinGetClass,class,ahk_id %id%
If (control = &quot;SysTabControl321&quot;) &amp;&amp; (class = &quot;AkelPad4&quot;)
	ControlSend,,{Ctrl Down}{Shift Down}{Tab}{Shift Up}{Ctrl Up},ahk_id %id%
Return

~WheelDown::
MouseGetPos,,,id,control,1
WinGetClass,class,ahk_id %id%
If (control = &quot;SysTabControl321&quot;) &amp;&amp; (class = &quot;AkelPad4&quot;)
	ControlSend,,{Ctrl Down}{Tab}{Ctrl Up},ahk_id %id%
Return</code></pre></div><p>Проблема в том, что если открыть окно AkelPad с несколькими вкладками, затем переключиться на любое другое окно и покрутить колесом над вкладками AkelPad, то его окно почему-то активируется.<br />Такое происходит только один (1-ый) раз: если снова активировать другое окно и покрутить колесом над вкладками AkelPad - его окно больше не активируется.<br />Если же окно AkelPad закрыть и снова открыть, то глюк снова вернётся на 1 раз.<br />Почему так происходит? Как этого избежать?</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Tue, 06 Nov 2012 14:33:36 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=65438#p65438</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: ControlSend в неактивное окно]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=65411#p65411</link>
			<description><![CDATA[<p>Спасибо большое вам обоим за помощь!<br />Мне интересно понять как работает написанный вами код и как вы узнали нужную команду, а также wParam и lParam для неё.<br />Как вы отловили, что нужное нам событие для PostMessage это именно WM_APPCOMMAND 0x319 с wParam и lParam равными [0, 0x10000] и [0, 0x20000]? Я был бы чрезмерно благодарен какому-нибудь тьюториалу по использования Winspector&#039;а или аналогичной программы для этих целей. В существующей статье - почему-то рассказывается, что отлавливать нужно было не WM_APPCOMMAND, а <strong>&quot;</strong>WM_COMMAND, начинающееся с &quot;Code: 0&quot;<strong>&quot;</strong>.<br /></p><div class="quotebox"><cite>vo1ty пишет:</cite><blockquote><p>Если вы переоткроете NPP, то PostMessage будет отправляться не туда</p></blockquote></div><p>Это из-за того, что вы используете<br /></p><div class="codebox"><pre><code>PostMessage WM_APPCOMMAND,0,0x10000,,ahk_id %hScintilla%</code></pre></div><p>и тут у меня возникает недопонимание, почему вы используете его так, ведь синтаксис PostMessage же такой:<br /></p><div class="codebox"><pre><code>PostMessage, Msg [, wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]</code></pre></div><p>Почему Control вы оставили пустым, а для WinTitle использовали не ahk_id самого Notepad++, а ahk_id Scintilla1? Т.е. тут Scintilla рассматривается не как контрол, а как окно?<br />Почему тогда не работает<br /></p><div class="codebox"><pre><code>ControlSend,,{Browser_Forward},Scintilla1</code></pre></div><p>?<br />Почему обязательно нужно обращаться к Scintilla1 по его хэндлу?<br />Обязательно ли посылать PostMessage контролам именно по их хэндлам?<br />Логично же было бы использовать, что-то вроде<br /></p><div class="codebox"><pre><code>PostMessage, WM_APPCOMMAND,0,0x10000,Scintilla1</code></pre></div><p>или<br /></p><div class="codebox"><pre><code>PostMessage, WM_APPCOMMAND,0,0x10000,,Scintilla1</code></pre></div><p>(я пока ещё не очень хорошо понимаю, когда к объекту стоит обращаться как к окну, а когда как к контролу).</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Mon, 05 Nov 2012 15:17:29 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=65411#p65411</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: ControlSend в неактивное окно]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=65409#p65409</link>
			<description><![CDATA[<p>Есть только один нюанс. Если вы переоткроете NPP, то PostMessage будет отправляться не туда, то есть, по сути, вообще не будет, поэтому лучше каждый раз снова находить окно. ИМХО, это не сильно-то и ресурсозатратно. Можно, например, сделать так:</p><div class="codebox"><pre><code>global hScintilla
WM_APPCOMMAND:=0x319

~WheelUp::
MouseGetPos,,,id,isItTabbar,1
WinGetClass, class, ahk_id %id%
If (isItTabbar = &quot;SysTabControl325&quot;) &amp;&amp; (class = &quot;Notepad++&quot;)
{
    GetNotepadScintilla()
    PostMessage WM_APPCOMMAND,0,0x10000,,ahk_id %hScintilla%
}
Return

~WheelDown::
MouseGetPos,,,id,isItTabbar,1
WinGetClass, class, ahk_id %id%
If (isItTabbar = &quot;SysTabControl325&quot;) &amp;&amp; (class = &quot;Notepad++&quot;)
{
    GetNotepadScintilla()
    PostMessage WM_APPCOMMAND,0,0x20000,,ahk_id %hScintilla%
}
Return

GetNotepadScintilla()
{
    ControlGet,hScintilla,Hwnd,,Scintilla1,ahk_class Notepad++
    if ErrorLevel
    MsgBox Ошибка при получении дескриптора, проверьте запущен ли Notepad++
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (vo1ty)]]></author>
			<pubDate>Mon, 05 Nov 2012 09:29:45 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=65409#p65409</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: ControlSend в неактивное окно]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=65400#p65400</link>
			<description><![CDATA[<div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>Прочитал тьюториал по работе с этой командой, поставил и покрутил Winspector, но всё равно не понял ничего.</p></blockquote></div><p>Попытайтесь ещё раз <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> , как альтернатива Winspector&#039;у - <strong><a href="http://sourceforge.net/projects/windowdetective/">Window Detective</a></strong></p><div class="codebox"><pre><code>global hScintilla
WM_APPCOMMAND:=0x319

~WheelUp::
if !hScintilla
GetNotepadScintilla()
else PostMessage WM_APPCOMMAND,0,0x10000,,ahk_id %hScintilla%
Return

~WheelDown::
if !hScintilla
GetNotepadScintilla()
else PostMessage WM_APPCOMMAND,0,0x20000,,ahk_id %hScintilla%
Return

GetNotepadScintilla()
{
	ControlGet,hScintilla,Hwnd,,Scintilla1,ahk_class Notepad++
	if ErrorLevel
	MsgBox Ошибка при получении дескриптора, проверьте запущен ли Notepad++
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (kirtech)]]></author>
			<pubDate>Mon, 05 Nov 2012 01:14:07 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=65400#p65400</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: ControlSend в неактивное окно]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=65398#p65398</link>
			<description><![CDATA[<p>Я так понимаю, что это невозможно.<br />Подскажите тогда, кто-нибудь, пожалуйста, как сделать отправку {Browser_Back} и {Browser_Forward} в окно Notepad++ используя PostMessage?<br />Прочитал тьюториал по работе с этой командой, поставил и покрутил Winspector, но всё равно не понял ничего.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Sun, 04 Nov 2012 23:33:51 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=65398#p65398</guid>
		</item>
		<item>
			<title><![CDATA[AHK: ControlSend в неактивное окно]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=65389#p65389</link>
			<description><![CDATA[<p>Здравствуйте.<br />Я написал скрипт, который позволяет переключаться между вкладками в окне Notepad++ прокруткой колеса мыши над панелью вкладок.<br /></p><div class="codebox"><pre><code>#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.

; Tab Wheel Scroll for Notepad++

#IfWinActive ahk_class Notepad++
~WheelUp::
MouseGetPos,,,,isItTabbar,1
If (isItTabbar = &quot;SysTabControl325&quot;)
Send {Browser_Back}
Return

~WheelDown::
MouseGetPos,,,,isItTabbar,1
If (isItTabbar = &quot;SysTabControl325&quot;)
Send {Browser_Forward}
Return</code></pre></div><p>Скрипт работает, но мне захотелось его усовершенствовать: сейчас скрипт требует, чтобы окно Notepad++ было активно, а хочется избежать этого требования: ahk умеет же определять имя control&#039;а под курсором, а с помощью ControlSend вроде бы можно посылать нажатие каких-то кнопок в неактивные окна.<br />Я перепробовал всё, но ControlSend в этом коде почему-то не даёт никакого результата:<br /></p><div class="codebox"><pre><code>~WheelUp::
MouseGetPos,,,id,isItTabbar,1
WinGetClass, class, ahk_id %id%
If (isItTabbar = &quot;SysTabControl325&quot;) &amp;&amp; (class = &quot;Notepad++&quot;)
    ControlSend,,{Browser_Back},ahk_id %id%
Return

~WheelDown::
MouseGetPos,,,id,isItTabbar,1
WinGetClass, class, ahk_id %id%
If (isItTabbar = &quot;SysTabControl325&quot;) &amp;&amp; (class = &quot;Notepad++&quot;)
    ControlSend,,{Browser_Forward},ahk_id %id%
Return</code></pre></div><p>Условие выполняется, но ControlSend не делает ничего.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Sat, 03 Nov 2012 18:27:18 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=65389#p65389</guid>
		</item>
	</channel>
</rss>
