<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Horn Network &#187; FindWindowEx</title>
	<atom:link href="http://klcin.tw/net/tag/findwindowex/feed" rel="self" type="application/rss+xml" />
	<link>http://klcin.tw/net</link>
	<description>Horn Network (.NET, ASP.NET, C#, VB.NET, JavaScript, Ubuntu, Android ...)</description>
	<lastBuildDate>Fri, 04 Mar 2011 07:25:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>[C#]程式幫您按按鈕（SendKey &amp; SendMessage）</title>
		<link>http://klcin.tw/net/csharp-sendkey-sendmessage</link>
		<comments>http://klcin.tw/net/csharp-sendkey-sendmessage#comments</comments>
		<pubDate>Fri, 05 Dec 2008 17:31:21 +0000</pubDate>
		<dc:creator>klcintw</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[問題與解決]]></category>
		<category><![CDATA[BN_CLICKED]]></category>
		<category><![CDATA[FindWindow]]></category>
		<category><![CDATA[FindWindowEx]]></category>
		<category><![CDATA[GetDlgCtrlID]]></category>
		<category><![CDATA[SendKey]]></category>
		<category><![CDATA[SendMessage]]></category>
		<category><![CDATA[WM_COMMAND]]></category>

		<guid isPermaLink="false">http://klcin.tw/net/?p=87</guid>
		<description><![CDATA[前言 專案中有個程式負責透過 ACDSee 列印（ProcessStartInfo.Verb=”Print”）各種圖檔。但 ACDSee 在列印時會出現讓使用者設定格式、頁首頁尾、印表機選項的視窗出現，要按下「列印(P)」之後才會真的開始列印，所以程式必須在開始工作時偵測 ACDSee 的狀態並且按下列印鈕。 方法如下： hWnd = FindWindow(null,”ACDSee &#8211; 列印”); // 尋找 ACDSee 的列印視窗 SetForegroundWindow(hWnd); // 將視窗帶到前景 SendKeys.SendWait(“{ENTER}”); // 送出 ENTER 鍵按列印鈕 事前測試都OK，但安裝到客戶的機器上卻經常發生沒有自動按列印鈕而卡住的問題。原以為是被其它程式干擾{ENTER}的發送，但奇怪的是同事在現場怎麼測試都無法重現問題，一離開不久客戶就反應問題又發生了。 最後，細心的同事發現是因為機器一段時間沒人操作就會被鎖住(lock)，流程卡住的問題就開始了！ 推測：當系統 lock 時，畫面看不到 ACDSee 的視窗（但 FindWindow 可以找到）所以 SendKey 無法送到正確的視窗。 解法 用 SendMessage 發送 WM_COMMAND 程式（C版） HWND hWnd = ::FindWindow(NULL, &#34;ACDSee - Print&#34;); if(NULL != hWnd) { HWND [...]]]></description>
			<content:encoded><![CDATA[<h2>前言</h2>
<p>專案中有個程式負責透過 <a href="http://tw.acdsee.com/zh-tw/" target="_blank">ACDSee</a> 列印（ProcessStartInfo.Verb=”Print”）各種圖檔。但 ACDSee 在列印時會出現讓使用者設定格式、頁首頁尾、印表機選項的視窗出現，要按下「列印(P)」之後才會真的開始列印，所以程式必須在開始工作時偵測 ACDSee 的狀態並且按下列印鈕。</p>
<p>方法如下：</p>
<ol>
<li>hWnd = <a href="http://msdn.microsoft.com/en-us/library/ms633499.aspx" target="_blank">FindWindow</a>(null,”ACDSee &#8211; 列印”); // 尋找 ACDSee 的列印視窗 </li>
<li><a href="http://msdn.microsoft.com/en-us/library/ms633539(VS.85).aspx" target="_blank">SetForegroundWindow</a>(hWnd); // 將視窗帶到前景 </li>
<li><a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.sendwait(VS.80).aspx" target="_blank">SendKeys.SendWait</a>(“{ENTER}”); // 送出 ENTER 鍵按列印鈕 </li>
</ol>
<p>事前測試都OK，但安裝到客戶的機器上卻經常發生沒有自動按列印鈕而卡住的問題。原以為是被其它程式干擾{ENTER}的發送，但奇怪的是同事在現場怎麼測試都無法重現問題，一離開不久客戶就反應問題又發生了。</p>
<p>最後，細心的同事發現是因為機器一段時間沒人操作就會被鎖住(lock)，流程卡住的問題就開始了！</p>
<p>推測：當系統 lock 時，畫面看不到 ACDSee 的視窗（但 FindWindow 可以找到）所以 SendKey 無法送到正確的視窗。</p>
<p>  <span id="more-87"></span><br />
<h2>解法</h2>
<p>用 <a href="http://msdn.microsoft.com/en-us/library/ms644950(VS.85).aspx" target="_blank">SendMessage</a> 發送 WM_COMMAND </p>
<h3>程式（C版）</h3>
<pre class="brush: c#">
    HWND hWnd = ::FindWindow(NULL, &quot;ACDSee - Print&quot;);
    if(NULL != hWnd)
    {
        HWND hButton = ::FindWindowEx(hWnd, NULL, &quot;BUTTON&quot;, &quot;&amp;Print&quot;);
        if(NULL != hButton)
        {
            ::PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(::GetDlgCtrlID(hButton), BN_CLICKED),(LPARAM)hButton);
        }
        else
        {
            AfxMessageBox(&quot;Can not find [Print]&quot;);
        }
    }
    else
    {
        AfxMessageBox(&quot;Can not find [ACDSee - Print]&quot;);
    }</pre>
<p>&#160;</p>
<h3>程式（C#版）</h3>
<pre class="brush: c#">
IntPtr hWnd = FindWindow(null, &quot;ACDSee - 列印&quot;);
if ( !hWnd.Equals(IntPtrZero) )
{
	IntPtr hButton = FindWindowEx(hWnd, 0, &quot;BUTTON&quot;, &quot;列印(&amp;P)&quot;);
	if ( !hButton.Equals(IntPtrZero) )
	{
		SendMessage(hWnd, WM_COMMAND, GetDlgCtrlID(hButton) , hButton);
	} // if
} // if

/* API 定義*/
[DllImport(&quot;User32.dll&quot;,EntryPoint=&quot;FindWindow&quot;)]
private static extern IntPtr FindWindow(string lpClassName,string lpWindowName); 

[DllImport(&quot;User32.dll&quot;)]
private static extern IntPtr FindWindowEx(IntPtr hwndParent, int hwndChildAfter, string lpszClass, string lpszWindow); 

[DllImport(&quot;user32.dll&quot;)]
public static extern int GetDlgCtrlID(IntPtr hWnd);

[DllImport(&quot;user32.dll&quot;, EntryPoint = &quot;SendMessageA&quot;)]
private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, IntPtr lParam);

private const int WM_COMMAND = 0x111;
private const int BN_CLICKED = 0;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://klcin.tw/net/csharp-sendkey-sendmessage/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

