Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0508: Einen IRC-Clienten per DDE fernsteuern

 von 

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:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

GetPrivateProfileStringA (GetPrivateProfileString), WritePrivateProfileStringA (WritePrivateProfileString)

Download:

Download des Beispielprojektes [8,49 KB]

'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-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

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?