2009-10-20 46 views
4

嗨,我希望做一個排序的WLM, 一個機器人,但在AutoIt的正常controlsend的不會工作使用控制發送上的Windows Live Messenger對於自動鍵入文本

的基本問題是,我怎麼能發送文本到Windows Live Messenger窗口沒有激活它?

例子: 有有人在WLM與激活窗口稱爲「喬普」我做的:

ControlClick("Joop","","[CLASS:DirectUIHWND; INSTANCE:2]","Left",1,322,507) 
ControlSend("Joop","","[CLASS:DirectUIHWND; INSTANCE:2]","Hi Joop") 

當我做這個

WinActivate("Joop","") 
ControlClick("Joop","","[CLASS:DirectUIHWND;INSTANCE:2]","Left",1,322,507) 
ControlSend("Joop","","[CLASS:DirectUIHWND; INSTANCE:2]","Hi Joop") 

,這並不工作,但它確實工作不過現在它啓動了我不想要的東西。 有問題與窗口整個MSN通話窗口是一個窗口,所以沒有額外的控制,所以我嘗試了contolClick上打字屏幕的座標,不succ6

這是彙總鍵入這就是。

Text: 
Position: 0, 28 
Size: 882, 607 
ControlClick Coords: 282, 180 
Style: 0x56000000 
ExStyle: 0x00010000 
Handle: 0x00190916 

>>>> Mouse <<<< 
Position: 1885, 557 
Cursor ID: 0 
Color: 0xFFFFFF 

>>>> StatusBar <<<< 

>>>> Visible Text <<<< 


>>>> Hidden Text <<<< 
CVoiceVideoAvatarHostWindow 

沒有人知道如何在文本框的東西而不激活它(這樣它可以在後臺運行),並使用像發送一個跛腳的功能。

或者我怎麼能發送文字到Windows Live Messenger窗口而不激活它

感謝 Matthy

回答

0

某些設計和界面變得非常困難,如果不是幾乎不可能,AutoIt的進軍讀取控制信息的接口。我建議或者通過自己的客戶端手動使用WLM協議,或者使用不會讓屏幕抓取文本困難或不可能的客戶端。在腳本的開頭你有你的WLM的狀態設置爲@SW_HIDE某處

0

好吧,也許最後的答案......至少這個測試程序我編寫的作品如下。稍後,當您嘗試使用ControlXxxx -stuff時,首先在活動窗口上設置一個變量。現在,您可以選擇阻止您的輸入並激活您的隱藏窗口。它現在按照上面描述的方式工作,然後重新激活最後一個活動窗口。可以再次撤銷輸入塊。

這應該解決與至少課間你的問題......你可以在此期間與您的鼠標光標風格發揮到模擬一些CPU的負荷,所以塊輸入不算違規。但行動是如此之快,你甚至不會承認它...(也許它會吞嚥一些按鍵雖然)

試試看!

Opt("WinTitleMatchMode", 2) 

#include <GuiConstantsEx.au3> 
$GUI = GUICreate("Beispiel HiddenApp", 392, 323) 
$ed = GUICtrlCreateEdit("nix", 1, 1, 390, 321) 
GUISetState() 

Sleep(1000) 

GUISetState(@SW_HIDE, $GUI) 
WinActivate("SciTE") 
Sleep(1000) 

BlockInput(1) 
$act = WinActive("[ACTIVE]") 
WinActivate($GUI) 
ControlClick($GUI, "", $ed, "primary", 1, 50, 50) 
ControlSend($GUI, "", $ed, "before{Alt}{Tab}after") 
WinActivate($act) 
BlockInput(0) 

Sleep(1000) 

GUISetState(@SW_SHOW, $GUI) 

While 1 
    Switch GUIGetMsg() 
     Case $GUI_EVENT_CLOSE 
      ExitLoop 
     Case Else 
      ;;; 
    EndSwitch 
WEnd 
1

MSN有意阻止自動化。這不是Windows API的限制。如果你的目標是一個自動化MSN聊天,你可以,或者通過自動化支持MSN(Digsby,洋涇浜等),並與自動化工作得更好另一個應用程序直接發送的TCP報文做這樣無論是。

通過直接發送你編寫自己的程序中的TCP數據包,從頭開始,這向外界表現就像MSN。有關於協議的用戶自制文檔。我過去使用的是:http://www.hypothetic.org/docs/msn/notification/authentication.php,但我完全不確定它是否仍然是最新的。如果您熟悉網絡,TCP,數據包捕獲和重放,那麼我建議採用這種方法,因爲它是最穩定,最長期的方法。 (我認爲:最有趣)

但是,並不是所有的項目都需要穩定和長期的方法。在我看來,你似乎只是將自己的一些應用程序自動化到計算機上,而MSN當然是更有趣的應用程序之一。微軟決定,當他們構建MSN客戶端時,任何人都不應該輕易嘗試自動化應用程序。我認爲這主要是爲了防止垃圾郵件。在早期它很有效,因爲其他人還沒有公開記錄該協議。因此,現在任何想要發送垃圾郵件的人都必須進行昂貴的投資。

如果你決定繼續與自動化官方MSN客戶端,或抵抗自動化任何其他應用程序,也有一些技巧,你可以嘗試:

  • ControlSend沒有指定控制參數(使用空串「」)
  • ControlClick與再次使用空字符串爲控制參數
  • 最後指定的座標在窗口上,簡單地發送/鼠標點擊帶有可選了BlockInput

有很多組合可以嘗試(特別是ControlX功能),有時會奇蹟般地工作,但請記住,最終它們都只是窗口消息。您可以使用_SendMessage函數自動執行所有操作,只要您知道自己在做什麼。

相關問題