VB 5/6-Tipp 0508: Einen IRC-Clienten per DDE fernsteuern
von Klaus Langbein
Beschreibung
Der bekannte IRC-Client mIrc™ hat eine sehr umfangreichen DDE-Befehlsatz. Hier wird gezeigt, wie man diesen nutzen kann, um das Programm fernzusteuern.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: GetPrivateProfileStringA (GetPrivateProfileString), WritePrivateProfileStringA (WritePrivateProfileString) | Download: |
'Dieser Quellcode stammt von http://www.activevb.de 'und kann frei verwendet werden. Für eventuelle Schäden 'wird nicht gehaftet. 'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. 'Ansonsten viel Spaß und Erfolg mit diesem Source! '-------------- Anfang Projektdatei ircaid.vbp -------------- '------- Anfang Formular "ircddef" alias ircddef.frm ------- ' Steuerelement: Schaltfläche "Command4" ' Steuerelement: Kombinationsliste "Combo2" ' Steuerelement: Textfeld "DDEtext" ' Steuerelement: Kontrollkästchen-Steuerelement "Check2" ' Steuerelement: Kombinationsliste "Combo1" ' Steuerelement: Schaltfläche "Command2" ' Steuerelement: Textfeld "Text7" ' Steuerelement: Schaltfläche "Command5" ' Steuerelement: Textfeld "Text5" ' Steuerelement: Textfeld "Text4" ' Steuerelement: Schaltfläche "Command3" ' Steuerelement: Schaltfläche "Command1" ' Steuerelement: Textfeld "Text2" ' Steuerelement: Textfeld "Text1" ' Steuerelement: Beschriftungsfeld "Label4" ' Steuerelement: Beschriftungsfeld "Label8" ' Steuerelement: Beschriftungsfeld "Label7" (Index von 0 bis 0) ' Steuerelement: Beschriftungsfeld "Label6" ' Steuerelement: Beschriftungsfeld "Label5" ' Steuerelement: Beschriftungsfeld "Label3" ' Steuerelement: Beschriftungsfeld "Label2" ' Steuerelement: Beschriftungsfeld "Label1" ' ' Autor: K. Langbein Klaus@ActiveVB.de ' Überarbeitet und kommentiert von Thomas Rodemer, Thomas@ActveVB.de Option Explicit Private Sub add_to_text2(plus As String) If Len(plus) = 0 Then Exit Sub Dim test As String, a1 As String, l As Long test = Text2.Text If Len(test) > 15000 Then ' Falls Text2.Text zu lang test = Right$(test, 15000) ' das Ende abschneiden und Text2.Text = test ' wieder zurückgeben End If a1 = Right$(plus, 1) l = Len(test) Text2.SelStart = l Text2.SelText = plus + Chr$(13) + Chr$(10) End Sub Private Sub Check2_Click() If Check2.Value = 1 Then Me.LinkTopic = "ircdde" Else Me.LinkTopic = "" End If End Sub Private Sub Combo1_Click() Call Command2_Click End Sub Private Sub Command1_Click() ' Alle Felder löschen DDEtext.Text = "" Text5.Text = "" Text2.Text = "" Text7.Text = "" End Sub Private Sub Command2_Click() On Error Resume Next Text7.LinkItem = "#channelname" Dim cmd As String cmd = Combo1.Text Text7.Text = "" Text7.LinkTopic = ircserver$ + "|" + cmd Text7.LinkMode = 2 Text7.LinkRequest Call pause(0.1, 1) Text7.LinkMode = 0 Combo1.SelLength = 0 Combo1.SelText = "" DoEvents End Sub Private Sub Command3_Click() ' Den Nickname setzen On Error Resume Next Combo1.Text = "nickname" Call Command2_Click DoEvents Text1.Text = Text7.Text End Sub Private Sub Command4_Click() Call get_channels End Sub Private Sub Command5_Click() ' Der Send-Knopf On Error Resume Next Text5.LinkTopic = ircserver + "|command" Text5.LinkMode = 2 Text5.LinkPoke Text5.LinkMode = 0 End Sub Private Sub DDEtext_Change() Dim comd As String, comdd As String comd = DDEtext.Text If Len(comd) = 0 Then Exit Sub End If comd = "" End Sub Private Sub Form_Load() ' Initialisiere Me.LinkTopic = "ircdde" Combo1.AddItem "Port" Combo1.AddItem "Servername" Combo1.AddItem "Nickname" Combo1.AddItem "(Users)" Combo1.AddItem "Version" Combo1.AddItem "Exename" Combo1.AddItem "Inifile" Combo1.AddItem "Connected" Combo1.AddItem "Connect" Combo1.AddItem "Channels" ircserver = Text4.Text ReDim dnick$(0) ReDim dchannel$(0) Call Command3_Click End Sub Private Function get_channels() As Integer ' Auslesen der Channels Dim tt As Long, t As Long, cnt As Long, no_response As Long, i As Long Dim channel As String, test As String, tst As String, get_dchannnels As Integer On Error Resume Next tt = Timer Text7.LinkItem = channel Text7.LinkTopic = ircserver + "|" + "Channels" test = Text7.Text Text7.LinkMode = 2 Text7.LinkRequest no_response = 0 t = Timer Do DoEvents If Timer - t > 1 Then no_response = 1 Exit Do End If Loop Until Text7.Text <> test If no_response = 1 Then Text7.Text = "No response" Else test = Text7.Text ReDim dchannel(0) As String cnt = 0 Do tst = eat(test, " ") If Left(tst, 2) = "*#" Then tst = Right$(tst, Len(tst$) - 1) End If If Len(tst) > 0 Then cnt = cnt + 1 ReDim Preserve dchannel(cnt) dchannel(cnt) = tst End If Loop Until Len(tst) = 0 Or tst = test End If Text7.LinkMode = 0 Combo1.SelLength = 0 Combo1.SelText = "" Combo2.Clear For i = 1 To UBound(dchannel) Combo2.AddItem dchannel(i) Next i Combo2.ListIndex = 0 DoEvents If no_response = -1 Then get_dchannnels = 0 Else get_dchannnels = UBound(dchannel) End If End Function Private Function get_dnicks(channel As String) As Integer ' Funktionen zum Auslesen der Nicknames der restlichen Chatter Dim tt As Long, no_response As Long, t As Long, cnt As Long Dim tst As String, i As Long, get_dchannnels, test As String On Error Resume Next tt = Timer Text7.LinkItem = channel Text7.LinkTopic = ircserver + "|" + "Users" test = Text7.Text Text7.LinkMode = 2 Text7.LinkRequest ' no_response = 0 t = Timer Do DoEvents If Timer - t > 1 Then no_response = 1 Exit Do End If Loop Until Text7.Text <> test If no_response = 1 Then Text7.Text = "No response" Else test = Text7.Text ReDim dnick(0) As String cnt = -1 Do tst = bite(test, " ") If Len(tst) > 0 Then cnt = cnt + 1 ReDim Preserve dnick(cnt) dnick(cnt) = tst End If Loop Until Len(tst) = 0 Or tst = test End If Text7.LinkMode = 0 Combo1.SelLength = 0 Combo1.SelText = "" DoEvents If no_response = -1 Then get_dnicks = 0 Else get_dnicks = UBound(dnick$) End If End Function Private Sub Text1_Change() Dim nick As String nick = Text1.Text End Sub Private Sub Text4_Change() Dim ircserver As String ircserver = Text4.Text End Sub '-------- Ende Formular "ircddef" alias ircddef.frm -------- '--------- Anfang Modul "Module1" alias Module1.bas --------- ' Autor: K. Langbein Klaus@ActiveVB.de ' Überarbeitet und kommentiert von Thomas Rodemer, Thomas@ActveVB.de ' Anleitung ' ' Um eine erfolgreiche Kontrolle über mIRC via DDE zu erlangen muss man ' folgendes beachten: ' ' 1. Der DDE Servername in mIRC muss "mirc" lauten (das ist die Standard- ' einstellung bei der Installation). Um den Servername in mIRC zu ändern ' geben Sie /ddeserver ON newservername ein. Wenn Sie den Servernamen in ' mIRC ändern, müssen Sie ihn auch in ircAID ändern ' ' 2. Starten Sie den DDE-Server in mIRC. Geben Sie /ddeserver ON ein. ' mIRC wird "*** DDE Server is ON (mIRC)" ausgeben. ' ' 3. Lesen Sie die Hilfe über DDE in der mIRC-Hilfedatei aufmerksam durch. ' ' Um DDE-Befehle von mIRC an IrcAid zu senden, geben Sie folgende Zeile in ' irgendeiner Eingabebox im mIRC ein: ' /DDE ircaid ircdde ddetext thisismytexttobesent ' lassen Sie "ircaid ircdde ddetext" unverändert, es sei denn Sie wollen den ' Namen des Services, den linktopic oder das Control, das die Nachrichten empfängt ' ändern. ' ' mIRC ist ein eingetragenes Warenzeichen der mIRC Co Ltd. ' Author: Kahled Mardam-Bey ' ' Diese Version von IrcAid wurde mit dem mIRC v.5.71 32bit auf W95 geteste, ' Option Explicit Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" ( _ ByVal lpApplicationName As String, ByVal lpKeyName As Any, _ ByVal lpDefault As String, ByVal lpReturnedString As String, _ ByVal nSize As Long, ByVal lpFileName As String) As Long Declare Function WritePrivateProfileString Lib "kernel32" _ Alias "WritePrivateProfileStringA" ( _ ByVal lpApplicationName As String, ByVal lpKeyName As Any, _ ByVal lpString As Any, ByVal lpFileName As String) As Long Global ircserver As String Global mircini As String 'inifile Sub pause(ByVal pau As Single, ByVal doev As Integer) Dim t As Single t = Timer Do If doev = 1 Then DoEvents End If Loop Until (Timer - t) >= pau End Sub Sub eros(ByVal subb As String, ByVal erno As Integer) 'Fehlerbehandlungsroutine On Error Resume Next MsgBox Format$(erno) + ": " + Error$(erno), 16, subb End Sub Function eat(test As String, delim As String) As String ' Die Variabel test$ wird verändert und zurückgegeben Dim pos As Integer Dim bit As String pos = InStr(1, test, delim, 1) If pos > 0 Then bit = Left$(test$, pos - 1) test = Right$(test, Len(test) - Len(bit) - Len(delim)) Else bit = test test = "" End If eat = bit End Function Function bite(tests As String, delim As String) As String ' Die Variabel tests wird verändert und zurückgegeben Dim pos As Integer Dim bit As String pos = InStr(1, tests, delim, 1) If pos > 0 Then bit = Left$(tests, pos - 1) tests = Right$(tests, Len(tests) - Len(bit) - Len(delim)) Else bit = tests End If bite = bit End Function '---------- Ende Modul "Module1" alias Module1.bas ---------- '--------------- Ende Projektdatei ircaid.vbp ---------------
Tipp-Kompatibilität:
Windows/VB-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 3 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von am 14.12.2005 um 10:25
dir Frage von Maz:
unter den Einstellungen Option-Others findest du nen Button mit DDE
Dort trägst du den Namen den die DDE schnittstelle haben soll ein.
Bei jedem mIRC Client den du als eigegen Threat offen hast musst du die Einstellung separat vornehmen.
zur Frage von mir selbst:
Hab das Problem gelöst
man hängt einfach den Befehl /scon <Servername>
davor. zB:
/scon irc.quakenet.org /msg #<channelname> <DeinText>
Kommentar von Shonsu am 13.12.2005 um 12:12
Wie müsste man den Code umschreiben, so das wenn man in einem mIRC Client mit mehreren Servern verbunden ist, um einen Channel auf einem bestimmten Server anzusprechen?
mit /msg #channelname TEXT
landet der Text immer auf dem Server der im mIRC gerade aktiv ist. Das ist aber nicht unbedingt der auf dem der Channel den ich angegebenn habe auch existiert.
Kommentar von Maz am 04.06.2005 um 15:22
Hmmm, wie müsste man den Cod eumändern, um einen Mirc-CLienten unter mehreren gezielt anzusprechen?