Home > Visual Basic > Menganalisa dan membuat mesin penjawab otomatis Y!M

Menganalisa dan membuat mesin penjawab otomatis Y!M

January 1, 2010

Sebelum kita melanjutkan pembahasan ada beberapa istilah yang harus kita ketahui yaitu Parent Window (Window Induk), Child Window (Window Anak) dan bagaimana cara mendapatkan nilai Handle Window (hWnd) atau dengan istilah yang lebih sederhana Process ID.

Setiap aplikasi yang berjalan di Windows umumnya memiliki jendela atau form. Jika ada beberapa jendela/form aplikasi berbeda yang terbuka, maka sistem akan memberikan semacam identitas bagi setiap jendela yang terbuka tersebut, di mana masing-masing jendela/form memiliki identitas atau alamat yang berbeda satu sama lain.

Konsep Child-Parent sangat sederhana, karena pengertian yang diberikan sama persis dengan namanya. Child/anak merupakan sebuah handle window yang berada di dalam handle window lainnya yang biasa disebut parent/induk. Oke kita lihat contoh berikut :

Dengan cara yang sama lakukan terhadap YM dan menghasilkan gambar berikut :

Nah yang jadi pertanyaan bagaimana caranya untuk mendapatkan nilai Handle, Caption dan Class dan yang terpenting disini adalah nilai Class. Ada banyak tool yang bisa digunakan salah satunya adalah Spy++, merupakan tool bawaan visual studio 6.

Oke kita langsung saja menjalankan program Spy++, lihat gambar :

Selanjutnya Anda tinggal drag icon ke aplikasi YM, lihat gambar :

Nah sampe disini analisis sudah selesai dan kita sudah mendapatkan semua informasi yang dibutuhkan, yaitu urutan windows parent<-anak :

  1. YSearchMenuWndClass <- IMClass <- YHTMLContainer <- Internet Explorer_Server
  2. YSearchMenuWndClass <- IMClass <- YIMInputWindow

Perlu diketahui bahwal class/window Internet Explorer_Server dan YIMInputWindow bukan class terluar, sehingga kita perlu mengetahui class diatasnya. Jadi untuk membaca pesan yang masuk, urutan class yang harus kita lalui adalah :
YSearchMenuWndClass ->  IMClass -> YHTMLContainer -> Internet Explorer_Server

Sedangkan untuk membalas pesan yang masuk, urutan kelas yang harus kita lalui adalah :
YSearchMenuWndClass ->  IMClass -> YIMInputWindow

Untuk memanipulasi class/window diatas kita membutuhkan windows handle/process id dari class tersebut, bagi yang sudah terbiasa menggunakan fungsi-fungsi API kemungkinan sudah tau fungsi API apa saja yang kita butuhkan. Jika masih bingung apa itu fungsi API, coba mampir ke sini.

Yaph benar udah taukan fungsi API yang kita gunakan untuk mendapatkan windows handle/process id :
1. FindWindow -> untuk mendapatkan process id induk class (YSearchMenuWndClass)
2. FindWindowEx -> untuk mendapatkan process id sub class (IMClass, YHTMLContainer, Internet Explorer_Server dan YIMInputWindow)
berikut deklarasi lengkapnya :

Private Declare Function FindWindow Lib &amp;quot;user32&amp;quot; Alias &amp;quot;FindWindowA&amp;quot; (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib &amp;quot;user32&amp;quot; Alias &amp;quot;FindWindowExA&amp;quot; (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

Oke berikutnya adalah bagian coding lengkap, bagaimana cara mengambil informasi yang ada di window Internet Explorer_Server dan mengirim pesan melalui window YIMInputWindow dan jangan lupa tambahkan references Microsoft HTML Object Library di project Anda.

Private Declare Function FindWindow Lib &amp;quot;user32&amp;quot; Alias &amp;quot;FindWindowA&amp;quot; (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib &amp;quot;user32&amp;quot; Alias &amp;quot;FindWindowExA&amp;quot; (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

Private Declare Function SendMessageByString Lib &amp;quot;user32&amp;quot; Alias &amp;quot;SendMessageA&amp;quot; (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Private Declare Function SendMessage Lib &amp;quot;user32&amp;quot; Alias &amp;quot;SendMessageA&amp;quot; (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Declare Function ObjectFromLresult Lib &amp;quot;oleacc&amp;quot; (ByVal lResult As Long, riid As UUID, ByVal wParam As Long, ppvObject As Any) As Long
Private Declare Function SendMessageTimeout Lib &amp;quot;user32&amp;quot; Alias &amp;quot;SendMessageTimeoutA&amp;quot; (ByVal hWnd As Long, ByVal msg As Long, ByVal wParam As Long, lParam As Any, ByVal fuFlags As Long, ByVal uTimeout As Long, lpdwResult As Long) As Long
Private Declare Function RegisterWindowMessage Lib &amp;quot;user32&amp;quot; Alias &amp;quot;RegisterWindowMessageA&amp;quot; (ByVal lpString As String) As Long

Type UUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(0 To 7) As Byte
End Type

Private Const SMTO_ABORTIFHUNG = &amp;amp;H2
Private Const WM_SETTEXT = &amp;amp;HC
Private Const WM_KEYDOWN = &amp;amp;H100
Private Const VK_RETURN = &amp;amp;HD

Dim hwndYMMainClass     As Long
Dim hwndIMClass         As Long

Private Function IEDOMFromhWnd(ByVal hWnd As Long) As IHTMLDocument
    Dim IID_IHTMLDocument   As UUID
    Dim doc                 As IHTMLDocument2
    Dim lres                As Long 'if = 0 isn't inet window.
    Dim lMsg                As Long
    Dim hr                  As Long

    '---END-DECLARES---------
    lMsg = RegisterWindowMessage(&amp;quot;WM_HTML_GETOBJECT&amp;quot;) 'Register Wnd Message
    Call SendMessageTimeout(hWnd, lMsg, 0, 0, SMTO_ABORTIFHUNG, 1000, lres) 'Get's Object

    '---CHECKS-FOR-WINDOW----
    hr = ObjectFromLresult(lres, IID_IHTMLDocument, 0, IEDOMFromhWnd)
End Function

Private Function getIEText(ByVal hWnd As Long) As String
    Dim doc As IHTMLDocument2

    'On Error Resume Next

    If hWnd &amp;lt;&amp;gt; 0 Then
        Set doc = IEDOMFromhWnd(hWnd)
    Else
        getIEText = &amp;quot;-[TEXT CANNOT BE FOUND]-&amp;quot;
        Exit Function

    End If

    '---CHECKS-FOR-HWND------
    If doc.body.innerText = vbNullString Then
        getIEText = &amp;quot;ERROR! [WINDOW DOESN'T CONTAIN HTML]&amp;quot;
        Exit Function
    End If
    '---CHECKS-FOR-HTML-EMBEDDED

    getIEText = doc.body.innerText
End Function

Private Sub cmdCetakPesan_Click()
    Dim hwndYHTMLContainer  As Long
    Dim hwndIEServer        As Long

    Dim pesan               As String

    hwndYMMainClass = FindWindow(&amp;quot;YSearchMenuWndClass&amp;quot;, vbNullString)
    If hwndYMMainClass &amp;lt;&amp;gt; 0 Then
        hwndIMClass = FindWindowEx(hwndYMMainClass, 0&amp;amp;, &amp;quot;IMClass&amp;quot;, vbNullString)
        hwndYHTMLContainer = FindWindowEx(hwndIMClass, 0&amp;amp;, &amp;quot;YHTMLContainer&amp;quot;, vbNullString)
        hwndIEServer = FindWindowEx(hwndYHTMLContainer, 0&amp;amp;, &amp;quot;Internet Explorer_Server&amp;quot;, vbNullString)

        pesan = getIEText(hwndIEServer) 'informasi pesan disini masih kurang bagus jadi harus di parsing lagi
        Debug.Print pesan
    End If
End Sub

Private Sub cmdKirimPesan_Click()
    Dim hwndYIMInputWindow  As Long
    Dim hwndButton          As Long

    hwndYMMainClass = FindWindow(&amp;quot;YSearchMenuWndClass&amp;quot;, vbNullString)
    hwndIMClass = FindWindowEx(hwndYMMainClass, 0&amp;amp;, &amp;quot;IMClass&amp;quot;, vbNullString)
    hwndYIMInputWindow = FindWindowEx(hwndIMClass, 0&amp;amp;, &amp;quot;YIMInputWindow&amp;quot;, vbNullString)
    Call SendMessageByString(hwndYIMInputWindow, WM_SETTEXT, 0&amp;amp;, &amp;quot;Isi pesannya disini...&amp;quot;)
    Call SendMessage(hwndYIMInputWindow, WM_KEYDOWN, VK_RETURN, 0&amp;amp;)
End Sub

Yaph mungkin itu saja penjelasan singkat untuk membuat mesin penjawab otomatis YM! untuk uji coba ini saya menggunakan YM! versi 8.1.0.421 bagi yang akan mencoba di versi 9 sudah saya cek ada sedikit perbedaan nama class/window, yang penting caranya sama seperti diatas tinggal sesuaikan saja.

Bagian terakhir dari artikel ini bisa Anda ikuti disini.

Selamat mencoba 🙂

  1. January 1, 2010 at 12:05 pm

    cool…

  2. February 2, 2010 at 5:32 am

    aespe :

    cool…

    Tq

  3. yahya
    June 14, 2010 at 9:19 am

    wah, manteb-mantep artikel nya…
    aku lg belajar nih BOZ tentang fungsi API,
    gimana ya Pak Boz supaya Project bikinan kita dieksekusi dikomputer orang tanpa mereka tahu.. hehehe..
    bukan untuk kejahatan lho.. cma buat belajar aja..
    bls ke email ku ya Pak Boz… yahya.shadowxxx@gmail.com

  4. June 15, 2010 at 1:29 am

    didaftarin aja mas programnya di registry berikut :

    1. HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
    2. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
    3. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
    4. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer\Run
    

    Jadi programmnya otomatis running klo windowsnya aktif 😀

  5. July 30, 2010 at 12:27 am

    Om, translate ke VB.Net donk . . . lagi pengen coba nih . . . 🙂

    • July 30, 2010 at 3:19 am

      Om emg yg vb 6 udah bisa ? 😀

      • July 31, 2010 at 10:41 am

        cukup paham om, cuma, yang jadi masalah, di komputer ini, cuma ada pidgin & saya menggunakan untuk multiple akun chat (gak cuma YM) apa tutor disini bisa digunakan om?? atau, ini bakal jadi Episode 3-nya??
        Judulnya : “Manganalisa source code mesin penjawab otomatis Pidgin 2.7.0 ke-atas”
        😀

  6. July 31, 2010 at 1:06 pm

    Bakalan berat om membuat artikel “Manganalisa source code mesin penjawab otomatis Pidgin 2.7.0 ke-atas”

    Sy udah cek nama classnya sama semua 😀

    • August 2, 2010 at 6:43 am

      wah . . . padahal ntar bisa keren ya om jadinya?? . . . qt bisa jawab otomatis semua akun messenger qt, dari YM,MSN, sampe fesbuk?? . . . 🙂

  7. August 2, 2010 at 7:08 am

    Seharusnya gitu om, bisa bantuin enggak 🙂

    • August 3, 2010 at 3:10 am

      nggak terlalu yakin om, tapi akan saya coba . . . 😉

  8. August 3, 2010 at 3:37 am

    Oke om sy tunggu 😀

    • August 3, 2010 at 5:58 am

      jangan ditunggu om, , kayaknya bakal lama. . . dilupain aja, ntar tau2 udah muncul di http://www.duniazhen.tk . . hehe

      • August 3, 2010 at 6:11 am

        Oke om klo gitu sy tunggu di duniaOM 😀

  9. afdoal
    September 16, 2010 at 6:40 pm

    terus kalo nih cara di implementasikan tuk baca billing explorer bisa juga kan bang??

    • September 17, 2010 at 6:28 am

      seharusnya bisa om, emg tujuannya buat apa nih?

      • afdoal
        September 20, 2010 at 10:08 pm

        cuma bwt refresing aja bang… 😀
        tapi kok gak bisa ya, baca user yang pake tuh billing… ato mungkin krn belum tidur jadi gak bisa2??
        xixixixixiix ^_^

        • September 22, 2010 at 1:14 am

          Wewww sya enggak punya billing explorer jadi enggak bisa nyoba om 😀

          • afdoal
            September 23, 2010 at 11:48 pm

            hm…. tak send by email ya bang… minimal dapatin nama user dan durasi kok 😀
            gimana??

            • September 24, 2010 at 12:47 am

              Oke tak tunggu

              • afdoal
                September 24, 2010 at 3:27 pm

                sudah bang.. sudah saya krim. sebelumnya terima kasih………

                ^_^

                • September 27, 2010 at 2:57 am

                  Ternyata enggak bisa om 😀

  10. Pas
    September 28, 2010 at 8:15 am

    Mas,,,,!!! Aku maseh buta bngt neh ma winsock n api..!!
    Bisa mas jlasin gk gimana caranya koneksi sebuah aplikasi yang udah kita
    rancang ke hardwarenya…!!
    Misalnya: Untuk running led….!!
    Bisa kasih gambaran gk mas…!!
    Makasih banyak ya mas…???
    Thanx before

    • September 28, 2010 at 9:13 am

      Oo klo cuma untuk ngontrol LED enggak perlu winsock n api, biasanya ngaksesnya via COM, coba referensi ini. Selain itu biasa udah ada cd SDK dari alatnya jadi tinggal pake aja CMIIW.
      Selamat mencoba 🙂

  11. October 9, 2010 at 7:25 am

    wah jadi inget2 dulu pas belajar Win32 API (sampe sekarang ga ngerti2)
    jadi pengen balik lagi ke VB6, sayang nih, uda pake Win7 jadi agak ga enak pake VB6..

  12. October 11, 2010 at 3:39 am

    Syukurlah om sy belom pake win7 😛

  13. October 11, 2010 at 10:20 pm

    saya pake win 7 juga terpaksa 😛
    win xp ga bs diinstal (ga ada driver bwt laptop) trus pas pake vista jg bermasalah.

    • October 12, 2010 at 1:31 am

      Enggak juga om, yg penting ulet aja googlingnya kemungkinan besar bisa dapat tuh driver untuk xpnya

  14. October 12, 2010 at 2:17 am

    hahahaha.. tapi sayangnya saya ga terlalu ulet om 😀
    uda gitu sekarang adik saya uda terlena dengan Win7, kalo balik ke XP bakal ngamuk2 kyknya.. hehehehehe

  15. October 15, 2010 at 1:42 am

    Oke om untung sy udah merasa cukup dg winxp (soalnya harus tau diri dg spek laptopnya sendiri :D)

  16. October 15, 2010 at 6:53 am

    hahahaha.. bisa aja si om..
    kadang2 kangen juga ama XP, kadang2 ada ide gila muncul di kepala saya:
    pake linux sbg OS utama, XP sbg virtual. hahaha

    • October 16, 2010 at 1:23 am

      Ya pelan2x aja om, sy sendiri juga pake ubuntu kok klo lagi main2x dengan java 😀

  17. October 16, 2010 at 2:22 am

    mantab om.. hehehe

  18. triple5iks
    October 21, 2010 at 2:32 pm

    wah sumpah juraganz,

    mampir kesini, jadi kangen megang2 vb lg 😛

    nice Tutorial ganz,
    two thumbs up ^:)^

    • October 21, 2010 at 3:26 pm

      wahhh ada juga ya juragan yg mampir ke sini, biasanya cuma om2x dari i-bego.

      emg skrg pegangannya apa gan ?

  19. DnA
    January 22, 2011 at 1:22 am

    irzan :
    wah jadi inget2 dulu pas belajar Win32 API (sampe sekarang ga ngerti2)
    jadi pengen balik lagi ke VB6, sayang nih, uda pake Win7 jadi agak ga enak pake VB6..

    Kenapa gak enak? saya pake win7 tetep ber VB ria 😀 tapi memang untuk bisa enjoy kita harus relakan aero theme win 7 untuk dinonaktifkan. soalnya kl gak gitu vbakan berjalan lamabat tertama di tampilan desain formnya. tapi begitu kita tidak gunakan aero theme vb berjalan sebagaimana mustinya jalan di XP kok.

    • January 22, 2011 at 4:23 am

      Mmm gitu ya om, tq infonya sy sendiri belom pernah nginstall Win 7 mengingat spek laptop sy yg pas2xan he he he 😀

  20. Komo
    February 2, 2011 at 5:56 am

    Mas, ko di visual basic 6 saya tidak ada microsoft spy ++. Apa mungkin gara gara sourcenya jelek? Soalnya saya beli di tukang cd :D. Kalo memang jelek mungkin mas ada source vb6 yang komplit? Kalo ada boleh minta mas 😀

    • February 2, 2011 at 6:04 am

      Klo mau yg komplit pake cd visual studio 6 om, klo yg cd vb6 tok memang enggak ada tool spy++nya

      • Komo
        February 2, 2011 at 6:47 am

        Ga ada yang jual Visual studio 6 lagi mas. Apa bisa pakai yang 2000,2005 ato yang 2008 mas?

        • February 2, 2011 at 7:12 am

          Ada ah klo d jogja banyak 😀

          • Komo
            February 2, 2011 at 7:24 am

            Wahahah. Ko di bandung ga ada ya? Udah 3 toko di santroni tetep ga ada. Harus hunting lebih ke pelosok ini mah 😀

            • February 2, 2011 at 7:36 am

              Ya udah pesan ke sy aja, ganti ongkos kirim + cd blank + keringat waktu burning-in kan panas ha ha ha.

              • Komo
                February 2, 2011 at 7:47 am

                Hmm. Ongkos kirim 2000 + cd blank 6000 + keringat 2000. Jadi semua 10000. Deal? 😀

                • February 2, 2011 at 8:40 am

                  he he he 😛

                  • Komo
                    February 2, 2011 at 10:47 am

                    Mas kan saya sudah coba download programnya. Dan sudah coba ikuti instruksinya. Tapi waktu ketik BANTUAN. Bacaanya gini terus mas “Keyword Keyword tidak terdaftar. Ketik BANTUAN untuk informasi lebih lanjut tidak terdaftar. Ketik BANTUAN untuk informasi lebih lanjut”. Kenapa ya mas?

  21. Komo
    February 2, 2011 at 5:09 pm

    Komo :
    Mas kan saya sudah coba download programnya. Dan sudah coba ikuti instruksinya. Tapi waktu ketik sesuatu, misalnya a. Bacaanya gini terus mas “Keyword aBookmark tidak terdaftar. Ketik BANTUAN untuk informasi lebih lanjut”. Jadi di belakang tulisannya pasti ada kata bookmark. Kenapa ya mas?

    Revisi pertanyaan 🙂

    • February 3, 2011 at 1:56 am

      Ooo berati ada perubahan om di Y!Mnya, solusinya gini aja om.

      Om masuk ke event tmrAutoReplay_Timer, kemudian cari baris kode

      Select Case UCase$(keyword)
      

      diatasnya ditambahkan perintah untuk mereplace string Bookmark menjadi kosong

      keyword = Replace(keyword, "bookmark", "", , , vbTextCompare) ' kode yg baru ditambahkan
      Select Case UCase$(keyword)
      

      Selamat mencoba 🙂

      • Komo
        February 3, 2011 at 2:44 am

        Tetep aja itu bookmark :)). Masih ada mas. Apa gara – gara ym yang di kasih program ke closed secara automatis? Soalnya waktu saya coba hilangkan Call closeYM(hwndYMMainClass) yang terdapat di Case Else
        msg = "Keyword " & msg & " tidak terdaftar. Ketik BANTUAN untuk informasi lebih lanjut" & vbCrLf & vbCrLf
        End Select

        Call ymChatSend(hwndYMMainClass, msg)
        'Call closeYM(hwndYMMainClass)
        Program bisa berjalan mas. Tapi ko server ama client malah saling replay :)). Apa ymnya harus punya settingan sendiri mas?

        • February 3, 2011 at 3:09 am

          coba diatas baris kode

          lstMessageIn.AddItem ymID & ": " & msg
          

          divalidasi juga string bookmarknya

          msg = Replace(msg, "bookmark", "", , , vbTextCompare)
          lstMessageIn.AddItem ymID & ": " & msg
          

          Selamat mencoba 🙂

          • Komo
            February 3, 2011 at 3:59 am

            Makasih mas. Sudah bisa. Tapi ada revisi sedikit.Tentang kodingnya
            msg = Replace(msg, "[B]", "[B]")
            Kalo bales ke ymnya tetap berupa coding mas. Tidak berubah jadi merah :D.Mungkin bisa di ganti jadi begini
            msg = Replace(msg, "[B]", "B/font>") Makasih mas codingnya :*. Tapi btw, kalau hasil ujiannya disimpan dimana ya mas? Kalau di database yang di simpan cuma timeoutnya. Tidak ada hasil dari ujian yang sudah di kerjakan.

            • February 3, 2011 at 4:12 am

              Komo :
              Makasih mas codingnya :*. Tapi btw, kalau hasil ujiannya disimpan dimana ya mas? Kalau di database yang di simpan cuma timeoutnya. Tidak ada hasil dari ujian yang sudah di kerjakan.

              Yahhh itulah tugas om komo utk menyempurnakan program diatas 😀

          • Komo
            February 3, 2011 at 4:10 am

            Komo :
            Makasih mas. Sudah bisa. Tapi ada revisi sedikit.Tentang kodingnya
            msg = Replace(msg, "[B]", "[B]")
            Kalo bales ke ymnya tetap berupa coding mas. Tidak berubah jadi merah .Mungkin bisa di ganti jadi begini
            msg = Replace(msg, "[B]", "B/font>") Makasih mas codingnya :*. Tapi btw, kalau hasil ujiannya disimpan dimana ya mas? Kalau di database yang di simpan cuma timeoutnya. Tidak ada hasil dari ujian yang sudah di kerjakan.

            Oalah ko jadi gitu. Maksud saya coding msg = Replace(msg, “[B]”, “[B]“) Jadi begini msg = Replace(msg, “[B]”, “B“) Satu lagi deh nanyanya. Kalo mau nyisipkan coding tapi tampilanya gimana ya mas? Maap saya masih cupu :).

  22. Komo
    February 3, 2011 at 4:12 am

    AAAAAAAAAAAAAAAAAAAAA. Gimana ini. Malah jadi ngerusak blog abang. Maap ya bang. Niatnya mau ngebantu :(.

    • February 3, 2011 at 4:16 am

      Iya kok jadi ancur2xan gini ya? 😀
      Malah merusak pemandangan ha ha ha 😀

  23. Komo
    February 3, 2011 at 4:18 am

    Admin :
    Yahhh itulah tugas om komo utk menyempurnakan program diatas

    Ok mas. Saya coba. Sekali lagi makasih ya. Dan maap blognya jadi berantakan. <<<< Sangat pemula 😦

    • February 3, 2011 at 4:55 am

      Oke om, ada masanya “ketika kita masih muda dan bodoh”
      Halahhhhh 😀

      • Komo
        February 3, 2011 at 3:03 pm

        Hohhohoh. Sekali lagi maap ya mas 🙂 dan makasih sourcenya. Sangat membantu :*

        • February 4, 2011 at 3:01 am

          Oke om sama2x 🙂

  24. Komo
    February 9, 2011 at 12:29 pm

    Mas mau nanya. Kalo cara ngedapetin tiap class di ym tinggal drag aja spy++ ke ymnya kan mas? Tapi ko berkali – kali nyoba cari class ymHtmlContainer ga dapet – dapet ya mas? Saya pake ym 10.

    • February 10, 2011 at 7:46 am

      Ya om memang agak susah untuk mendapatkan class YHTMLContainer di Y!M versi 10, tp jangan kuatir ada cara lain 🙂

      Lihat GAMBAR

      Selamat mencoba 🙂

      • Komo
        February 11, 2011 at 4:11 pm

        Terima kasih om :-*

        • February 12, 2011 at 1:10 am

          Sama2x om 😛

  25. Komo
    February 12, 2011 at 4:08 am

    Boleh nanya lagi ga om? Hehe. Maap banyak tanya. Kalau masalah keterhubungan antar tabel di databasenya om. Kenapa cuma table history dan sesi yang punya relasi. Sedangkan bank_soal dan ym_id cuma berdiri sendiri? Apa ym_id dan bank_soal bisa juga diadakan relasi ke tabel history misalnya. Maap ya om banyak tanya 😦

    • February 12, 2011 at 10:07 am

      Fokus artikel diatas bukan masalah relasi tabel om, jadi harap maklum 😀
      Intinya sy buat rancangan tabelnya sesimple mungkin utk mengakomodasi contoh mesin penjawab otomatis YM! nya.

      • Komo
        February 12, 2011 at 3:23 pm

        Tapi misalnya saya buat relasi sendiri seperti contoh di atas apa berpengaruh pada programnya om?

        • February 13, 2011 at 12:07 am

          Seharusnya enggak, asal data yg masuk valid.

          • Komo
            February 13, 2011 at 12:42 am

            Maksudnya data valid apa om? Maap :(. Bodo banget sih komo 😦

            • February 13, 2011 at 6:24 am

              Emg udah belajar perancangan database belum om ?

              Maksud sy, valid disini ada hubungannya dengan Primary Key dan Foreign Key

              • Komo
                February 13, 2011 at 6:02 pm

                Udah sih om. Tapi kebetulan database saya c :(. Bisa dijelaskan dengan lebih sederhana ga om? Saya niatnya mau bikin relasi seperti komentar #64. Apa bisa om? Dan kalau bisa bagaimana caranya? Maap ya om. Blank banget ama database mah 😦

                • February 14, 2011 at 2:04 am

                  Dapat C ya om ? ya udah belajar lagi disini.

                  Ya tinggal terapkan aja om relasinya

                  • Komo
                    February 14, 2011 at 2:44 am

                    Ok om. Makasih :*. Maap banyak tanya. Insya allah saya akan coba sendiri :D. Tapi kalo mentok boleh kesini lagi kan om?

                    • February 14, 2011 at 4:04 am

                      Oke om

  26. komo
    February 16, 2011 at 9:22 am

    Om, kalo waktu kita ketik mulai mau ada sejenis password digimanain ya om? Jadi waktu ketik mulai si program minta password. Misal saya udah bikin tabel dengan nama password dan di dalamnya terdapat field key. Terus di dalam field key mempunyai isi field berupa komo.

    • February 16, 2011 at 10:04 am

      Trus kita tau passwordnya dari mana ?

  27. komo
    February 16, 2011 at 10:12 am

    Iya om. Jadi passwordnya kita bikin sendiri di database. Terus waktu kita ketik mulai dia minta pasword dulu. Kalo benar kita mulai. Kalo ennga tidak akan mulai. Seperti kasus di atas kan saya bikin tabel password. Terus ada kolom key. Terus di kolom key ada field komo. Jadi paswordnya itu komo om. Jadi misal kita ketik mulai komo baru jalan itu program. Misalnya mulai kokom itu program ga akan jalan. Di case “MULAI” nya saya harus tambahin apa om? Biar nanti seperti sekenario di atas.

  28. February 17, 2011 at 2:03 am

    setelah case “MULAI” di log dulu usernya udah menginputkan password atw belum, klo belum langsung send balik untuk menanyakan passwordnya

    • komo
      February 17, 2011 at 3:42 pm

      Terus untuk akses ke table password itu gimana om?

      • February 17, 2011 at 10:12 pm

        Ya om tinggal melakukan query “SELECT” ke table password, sama seperti yg om biasa lakukan untuk menampilkan data.

        Pertanyaan balik, om udah pernah buat APLIKASI DATABASENYA kan ?

        • komo
          February 18, 2011 at 2:54 am

          Hmm. Belum. Hehe. Ya udah. Biar saya mencoba mengerjakan sebisa saya saja om. Makasih telah ngasih banyak saran dan maap banyak merepotkan 😀

          • February 18, 2011 at 3:50 am

            Oke om, saran sy walaupun lagi ngejar target TA, ya tetap dasar2x programmingnya di pelajari terutama basic untuk akses databasenya

  29. toyb
    July 9, 2011 at 3:20 am

    wah sangat senang sekali saya menemukan blog ini….

    maaf ada sedikit pertanyaan nih….
    apakah source yang bapak kembangkan nantinya juga akan berpengaruh pada versi yahoo messenger yg dikeluarkan oleh yahoo! ?

    mengingat yahoo sendiri termasuk sering mengeluarkan versi yg lebih baru…

    terimakasih

    • July 9, 2011 at 4:04 am

      Klo sy bandingkan mulai dari versi 8 s.d 10 memang ada perbedaan tetapi hanya pd nama class dialognya jadi inti dari programnya sendiri tidak berubah, mungkin sebagai referensi tambahan om bisa cek link ini.

  30. toyb
    July 9, 2011 at 4:55 am

    maksih banyak om atas jawabanhhya…

    • July 10, 2011 at 7:49 am

      Sama2x om

  31. toyb
    July 9, 2011 at 4:57 am

    btw YM sy Di Add dong OM

    • July 10, 2011 at 7:49 am

      Oke om 🙂

  32. azharry
    December 10, 2011 at 9:26 pm

    Pak dosen, murid yg gak pernag bayar spp ini nongol lagi. sy lagi coba untuk memberi value ke textbox diaplikasi lain, saya dah coba dibeberapa aplikasi dengan menggunakan spy++ bisa di intercept, tapi ni ada satu aplikasi tapi nama classnya sama gimana cara ngakalinya pa dosen.. tuluuuunngggggg mohon pencerahanya…. matur tankyu pak dosen….

    • December 11, 2011 at 7:42 pm

      Emg aplikasi apaan om ?

  33. azharry
    December 12, 2011 at 6:26 pm

    aplikasi dealer motor pak dosen. tapi udah ketemu koq caranya, jadi kalo ketemu control/window yang class dan captionnya sama di loop aja hanlde windownya terus secara urutan kita bisa isi value dengan yang diinginkan. btw maturnuwun atensinya…..

    • December 13, 2011 at 8:22 am

      Wah kren om, jadi penasaran pengen liat kodenya 😀

  34. Azharry
    December 13, 2011 at 10:04 am

    yo wis kita berbagi aja….

    dim HwndUtama as long
    dim HwndAnak as long

    HwndUtama=findwindow(NamaClassFormUtama, CaptionFormUtama)

    hwndAnak=0

    ‘menampilkan nilai handle window dengan class dan caption yang sama di ListBox
    Do
    HwndAnak=findwindowex(HwndUtama, HwndAnak,NamaClassControlAnak, CaptionControlAnak)
    if HwndAnak=0 exit Do
    list1.additem(HwndAnak)
    loop

    ‘memberi nilai pada tiap control/window secara berurutan

    if list1.ListCount > 0 then
    list1.listIndex=0
    SendMessageByString(list1.text, WM_SETTEXT, 0&, NilaiIsianA)

    list1.listIndex=1
    SendMessageByString(list1.text, WM_SETTEXT, 0&, NilaiIsianB)

    list1.listIndex=2
    SendMessageByString(list1.text, WM_SETTEXT, 0&, NilaiIsianC)

    ‘dan seterusnya

    end if

    moga bermanfaat….

    btw makin seru diskusi di blognya pak dosen. LANJUTKAN!

    • December 14, 2011 at 3:41 pm

      Tq om sumbangan kodenya.
      Iya om lumayan rame, berkat pengunjung2x seperti om 🙂

  35. awal
    January 25, 2012 at 3:44 pm

    Wah rame ni blognya… 🙂

    Mohon wangsit pencerahan. Apa ada untuk membaca textbox YM pake file dll, atau api. jadi ga harus buka YM client-nya. bisa langsung login ke server gitu mas. Matur Nuwun

    • January 26, 2012 at 8:38 am

      Coba kesini om.

  36. awal
    January 26, 2012 at 9:11 am

    Hehehe bingund… Implementasinya gmn yak kalo di vb 🙂

    • January 26, 2012 at 11:48 am

      Sama om sy juga blm coba 😀
      Sekilas liat dokumentasinya bisa diimplementasikan menggunakan C# atau VB .NET

  37. June 30, 2012 at 5:30 pm

    kang admin, mohon pencerahanya dong
    kalo pake API biar bisa baca text yang ada di aplikasi lagi gimana ya? kalo yang disitu kan dari Objct HTML tuh ya. aku utak atik ga ketemu2, mau nyari juga ga tau mau nyari kemana. Kalo ada rujukan referensi nya juga.
    eh.. iya. kalo itu buat baca di object yang dari aplikasi java gitu bisa ga ya..

    matur sembah nuwon sak derenge..

    • June 30, 2012 at 9:34 pm

      Coba di test dulu contoh sederhana berikut (membaca text notepad dari aplikasi vb)

      Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
      Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
      Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
      Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
      
      Private Const WM_GETTEXT = &HD
      Private Const WM_GETTEXTLENGTH = &HE
      
      Private Function GetText(ByVal hwnd As Long) As String
      
          Dim lngLength As Long
          Dim strBuffer As String
          Dim lngRet As Long
      
          lngLength = SendMessage(hwnd, WM_GETTEXTLENGTH, 0&, 0&) + 1
          strBuffer = Space$(lngLength)
          lngRet = SendMessage(hwnd, WM_GETTEXT, Len(strBuffer), ByVal strBuffer)
          If lngRet > 0 Then
              GetText = Left$(strBuffer, lngRet)
          End If
      End Function
      
      Private Sub Command1_Click()
          Dim hWndNotepad As Long
          Dim hWndText    As Long
          Dim ret         As Long
          Dim isiNotepad  As String * 255
          
          hWndNotepad = FindWindowEx(0&, 0&, "Notepad", vbNullString)
          hWndText = FindWindowEx(hWndNotepad, 0&, "Edit", vbNullString)
          
          Text1.Text = GetText(hWndText)
      End Sub
      

      Lihat gambar

      • June 30, 2012 at 9:59 pm

        alhamdulilah mantap ini kang. tak coba udah bisa. Matur nuwon sanget.
        tapi kalo tau ini bisa diterapin buat baca di jendela aplikasi java ga kang? soalnya di komputer aku ga ada java nya.
        Matur nuwon lagi.

        eh iya.. maaf kalo lancang. kalo boleh saya minta ID YM nya kang.

        Matur nuwon lagi.

        • July 1, 2012 at 11:24 am

          Loh kok malah sy yg harus menginstall java dan mencobanya, bukannya om yg butuh.

          Kan udah sy kasih samplenya, bukannya tinggal dipelajari dan dikembangkan sesuai kebutuhan.

          • July 1, 2012 at 12:13 pm

            aduh.. maaf banget. ane kira di komputer akang udah ada aplikasi java nya. kan kang admin juga develop pake java juga. hehe
            maaf tanya lagi ya. apa ada apilikasi lain lagi selai spy++ buat baca kelas dari jendela gitu. soalnya itu tak spy++ tak pake buat baca jendela option di firefox ga kebaca. yang kebaca cuma kelas di jendela utama. padahal disitu kan ada banyak text box dll.
            terimakasih untuk infonya

            sekali lagi maaf banget ya kang. soal instal aplikasi java nya 🙂 kang admin ga usah instal aplikasi java nya ya. biar ane yang nyoba nyari. hehe.

            • July 1, 2012 at 12:29 pm

              Oke deh gpp, sy skrg fokus di C# kok klo Java itu masa lalu 😀

              • July 1, 2012 at 12:50 pm

                ow. sekarang pindah ke C# toh. kenapa. ga java? ga .net ? maaf [OOT] nih. saya mau minta saran kalo untuk aplikasi dekstop mending pindah ke apa ya?
                trims

                • July 1, 2012 at 1:00 pm

                  C# itu ya salah satu pemrograman yg ada di .NET om.
                  Alasannya ya sederhana, karna di kantor sy pake .NET 😀

                  • July 1, 2012 at 1:20 pm

                    ow gtu. gtu aja ya. 😀 oke deh.
                    trims ya.

  38. June 30, 2012 at 5:32 pm

    Reblogged this on SuperProg06's Blog and commented:
    salam kenal

    • June 30, 2012 at 9:34 pm

      Salam kenal juga om 🙂

  39. bradhawk
    January 24, 2013 at 7:30 pm

    saya sedang mengembangkan aplikasi menggunakan YahooMessenger, tutorial ini sangat membantu, terima kasih atas tutorial yang diberikan. 🙂

    saya ada masalah dalam pembuatan aplikasi untuk mengirimkan pesan ke suatu akun, saya menggunakan Text box yang ada ditampilan YM10, saya mendapatkan class Text box tersebut menggunakan Spy++ yang menghasilkan class parent dan child sbg berikut : YahooBuddyMain > CMerlinWndBase > ATL:008AC990

    namun setelah di implementasikan ke VB6, saya tidak mendapatkan hasil seperti yang saya inginkan, source codnya seperti ini :

    Dim hwndYahooBuddyMain As Long
    Dim hwndMerlinWndBase As Long
    Dim hwndID As Long
    Dim ymIDToSend As String

    ymIDToSend = “akun_YM”

    ‘ Send message Window = YahooBuddyMain > CMerlinWndBase > ATL:008AC990
    hwndYahooBuddyMain = FindWindow(“YahooBuddyMain”, vbNullString)
    hwndMerlinWndBase = FindWindowEx(hwndYahooBuddyMain, 0&, “CMerlinWndBase”, vbNullString)
    hwndID = FindWindowEx(hwndMerlinWndBase, 0&, “ATL:008AC990”, vbNullString)

    Call SendMessageByString(hwndID, WM_SETTEXT, 0&, ymIDToSend)
    Call SendMessage(hwndID, WM_KEYDOWN, VK_RETURN, 0&)

    kira-kira apa yang salah, terima kasih sebelumnya

    • January 24, 2013 at 8:15 pm

      Maksudnya ngirim Instant Message ya om ? Klo iya coba kode berikut :

      Private Sub cmdTestSendInstantMsg_Click()
          Dim hwndYMMainClass     As Long
          Dim YHandle             As Long
          Dim hMain               As Long
          Dim hSub                As Long
          Dim SelectItemID        As Long
          
          Dim hwndMsgrBuddyTab    As Long
          Dim hWndInstantMsg      As Long
          
      
          Dim hwnd32770           As Long
          Dim hwndEdit            As Long
          
          Dim i                   As Integer
          
          Dim ymIDTarget          As String
          Dim ymMsg               As String
          
          YHandle = FindWindow("YahooBuddyMain", vbNullString)
          
          hMain = GetMenu(YHandle)
          hSub = GetSubMenu(hMain, 2)
          
          ' cek dialog Send Instant Message
          hWndInstantMsg = FindWindow("#32770", "Send an Instant Message")
          
          ymIDTarget = "aries_boy82"
          ymMsg = "Tes ngirim pesan via Instant Message"
          
          If hWndInstantMsg = 0 Then ' klo dialog Send Instant Message belum diaktfkan
          
              SelectItemID = GetMenuItemID(hSub, 0&)
              PostMessage YHandle, WM_COMMAND, SelectItemID, 0& ' akses menu send instant message
              
              Do While hWndInstantMsg = 0
                  hWndInstantMsg = FindWindow("#32770", "Send an Instant Message")
                  
                  DoEvents
              Loop
              
              Do While hwndMsgrBuddyTab = 0
                  hwndMsgrBuddyTab = FindWindowEx(hWndInstantMsg, 0&, "MsgrBuddyTab", vbNullString)
                  
                  DoEvents
              Loop
              
              ' fokus ke tab other contact
              For i = 1 To 30
                  SendMessage hwndMsgrBuddyTab, TCM_SETCURFOCUS, 1&, 0&
                  DoEvents
              Next i
              
              ' cek class #32770, karna objek text untuk mengetikkan YM ID merupakan child dari class ini
              hwnd32770 = FindWindowEx(hWndInstantMsg, 0&, "#32770", vbNullString)
              hwndEdit = FindWindowEx(hwnd32770, 0&, "Edit", vbNullString)
              
              ' tulis target YM ID
              Call SendMessageByString(hwndEdit, WM_SETTEXT, 0&, ymIDTarget)
      
              ' tekan tombol enter
              PostMessage hwndEdit, WM_KEYDOWN, VK_RETURN, 0&
              
              Do While hwndYMMainClass = 0
                  hwndYMMainClass = FindWindow("CConvWndBase", vbNullString)
                  
                  DoEvents
              Loop
              
              ' kirim pesan
              Call ymChatSend(hwndYMMainClass, ymMsg)
              
          Else
              hwndMsgrBuddyTab = FindWindowEx(hWndInstantMsg, 0&, "MsgrBuddyTab", vbNullString)
              
              ' fokus ke tab other contact
              SendMessage hwndMsgrBuddyTab, TCM_SETCURFOCUS, 1&, 0&
              
              ' cek class #32770, karna objek text untuk mengetikkan YM ID merupakan child dari class ini
              hwnd32770 = FindWindowEx(hWndInstantMsg, 0&, "#32770", vbNullString)
              hwndEdit = FindWindowEx(hwnd32770, 0&, "Edit", vbNullString)
              
              ' tulis target YM ID
              Call SendMessageByString(hwndEdit, WM_SETTEXT, 0&, ymIDTarget)
              
              ' tekan tombol enter
              PostMessage hwndEdit, WM_KEYDOWN, VK_RETURN, 0&
              
              Do While hwndYMMainClass = 0
                  hwndYMMainClass = FindWindow("CConvWndBase", vbNullString)
                  
                  DoEvents
              Loop
              
              ' kirim pesan
              Call ymChatSend(hwndYMMainClass, ymMsg)
              
          End If
      End Sub
      
      • bradhawk
        January 25, 2013 at 4:59 pm

        terima kasih om, 🙂
        namun banyak function yang belum didefinisikan, seperti “FindWindow’, dan ‘WM_COMMAND’..
        untuk FindWindow sudah saya definisikan, namun ‘WM_COMMAND’ saya bingung didefinisikan dengan apa. thanks 🙂

      • bradhawk
        January 25, 2013 at 5:04 pm

        udah bisa om, makasih banyak 🙂

        • January 27, 2013 at 5:31 pm

          Oke sama-sama om 🙂

  40. March 6, 2014 at 5:13 pm

    kalau mesin penjawab otomatis BBM gmn ya? tolong buat detailnya kyk keterangan di atas.

    • March 8, 2014 at 9:22 am

      Iya nunggu BBMnya support untuk PC dulu 😀

  1. April 16, 2014 at 9:12 am
Comments are closed.