2010-04-01 55 views
0

在Google Chrome中,只需打開對話框並在對話框上執行CTRL-C,即可檢索JavaScript警報/對話框的文本。這會將對話框中的文本放入剪貼板。在C#中使用SendMessage在給定的句柄上執行CTRL-C操作

我試圖用SendMessage發送CTRL-C在JavaScript對話框的文本上執行復制。我已經設法使用SendInput來做到這一點,但不幸的是,如果窗口沒有焦點,可能會失敗。

我已經嘗試使用WM_COPY消息的SendMessage,但沒有爲我的需要工作。

如果有人在成功使用SendMessage之前做過這些工作,我將非常感謝您的幫助。

回答

0

嘗試使用這些

WM_CUT = 0x300 
WM_COPY = 0x301 
WM_PASTE = 0x302 
WM_CLEAR = 0x303 

爲根據您的操作WMSG PARAM。

+0

我,我試圖WM_COPY問題提及。不幸的是,它不適合我的需求。我需要能夠執行擊鍵,但通過SendMessage調用。 – gtaborga 2010-04-01 21:17:35

+0

@gtaborga:這是正確的答案。你只是不要把它發送到正確的窗口。 – 2010-04-01 21:37:39

0

由於這個問題有點含糊不清,您是否在討論發送Ctrl + C按鍵來終止進程,還是將選擇複製到剪貼板。如果是前者,請在SO上查看這個回答herehere,這是前一個問題,OP詢問如何將Ctrl + C按鍵發送到shell進程以終止它。

如果您是複製選擇到剪貼板談論按Ctrl + C,也就是是否選擇確實被複制到剪貼板之前,首先選擇更加棘手爲...

如果我至少,請糾正你的問題,使其更清晰!

+0

對於問題的模糊性,我表示歉意。我確實想要做一個副本;但是,它正在Google Chrome中的JavaScript對話框的對話內容上完成。如果您只選擇了Google Chrome對話框並使用擊鍵執行CTRL-C,則它實際上會複製對話框的整個文本。這就是我想要表現的。它要求不要選擇文本來使其工作。所需要的只是執行擊鍵。 – gtaborga 2010-04-01 21:15:56

0

如果WM_COPY失敗,有幾個途徑,你可以嘗試...

假一按鍵就可以發送WM_KEYDOWN和WM_KEYUP消息。

但是,您在郵件中發送了什麼?如果您發送「c」,則這些消息中沒有辦法通知應用程序ctrl也被按下。

您可能能夠發送字符0x03(這是ctrl + c實際生成的字符代碼),但不能保證接收應用程序會將其解釋爲「ctrl + c」操作。

爲什麼它不起作用?接收應用程序可能會...

  • 忽略WM_KEYDOWN和WM_KEYUP和使用其他手段來讀取鍵盤(如GetAsyncKeyState,看是否有鍵被按下)
  • 手柄WM_KEYDOWN和/或WM_KEYUP消息,但看「c」,然後使用GetAsyncKeyState()或類似函數檢測消息處理時ctrl是否關閉。
  • 如果消息沒有輸入焦點,或者更糟糕,它可能仍會忽略消息,就像通過輸入焦點窗口接收消息一樣。

所以 - 嘗試一下,但它可能無法正常工作。

或者,如果SendInput有效,那麼您可以將輸入焦點強制爲正確的控件SendInput,然後將輸入焦點恢復到其以前的位置。

另一種方法(可能是最好的一種)是,如果它是一個已知的對話框並且它包含一個靜態文本字段,那麼您可能只能找到該子控件和GetText(發送WM_GETTEXT消息),並且避免使用剪貼板。 (或者如果您需要剪貼板上的文本,請像這樣獲取,然後自己將其放在剪貼板上)。這將避免欺騙應用程序提供文本,並回退到標準的Windows行爲。

+0

感謝您的回覆。我將嘗試使用0x03與WM_KEYDOWN和WM_KEYUP。請閱讀我更新的問題,瞭解我想要做的更多細節。不幸的是WM_GETTEXT不工作,因爲對話框沒有暴露文本。我試圖通過Spy ++訪問它。我唯一可以檢索的是對話框的標題,這不是我正在尋找的。 – gtaborga 2010-04-01 21:35:20

0

我意識到這是一個古老的問題,但由於一直沒有得到滿意的答覆,請允許我以迫使爲別人尋找:

SendMessage()不是必需的。只需使用:

System.Windows.Forms.SendKeys.SendWait("^(c)"); 

如果你要粘貼:

System.Windows.Forms.SendKeys.SendWait("^(v)"); 
+0

當然已經很久了。我還沒有嘗試過你的解決方案,但從看它,它似乎要求你已經專注於窗口根據https://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys .sendwait(v = vs.110).aspx到目前爲止,大多數解決方案似乎都需要這樣做。 SendInput我也試過了。感謝您提供幫助。我從未想過我會再次看到回覆。 :) – gtaborga 2016-04-17 03:01:50