folder Tahribat.com Forumları
linefolder Tahribat.com Programları®
linefolder Google Anında Çeviri (Küçük Bir Programcık)



Google Anında Çeviri (Küçük Bir Programcık)

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Tugberk
    Tugberk's avatar
    Kayıt Tarihi: 04/Ekim/2009
    Erkek

    Selam müridler, kendi kullanımım için basit bir tool yazdım, yazmışken belki başkalarının da işine yarar diye paylaşayım dedim. Hem kodları da biraz açıklayacağım ilgilenenler olabilir.

    Programın yaptığı şey çok basit, her hangi bir penceresi yok, sadece arka planda çalışıyor, her hangi bir yerde ingilizce bir metni seçiyorsunuz, sağ ctrl tuşuna bir kere basıyorsunuz ve metnin çevrilmiş hali ekrana yazıyor. Çıkmak için de F10 a basıyorsunuz bu kadar.

    iw3qtc.png%20%28383×162%29

    Seçebildiğiniz bütün metinler için çalışır, .doc .pdf .txt veya web sayfası farketmez, çeviriyi google translate üzerinden yapar, 255 karaktere kadar cümle çevirisi yapabilirsiniz ancak google bu konuda pek maharetli sayılmaz.

    Benim gibi metinleri üzerine tıklayıp seçerek okuyorsanız, bir de ara sıra bilmediğiniz bir kelime çıktığında google translate ile çevirip konuya dönmek hoşunuza gitmiyorsa tool size pratik gelebilir.

    Örnek resim:

    2rg0tmx.png%20%28639×374%29


    Kod ile ilgili açıklamalar ikinci mesajımda gelecek, indirmek için aşağıdaki linki kullanın (windows 7 x86 x64 test edildi)

    http://www.sendspace.com/file/4jt5dx

    Şifre: tahribat

    32 bit ve 64 bit windows ta çalışır. C ile yazıldı, kodu zip dosyasının içinde programla birlikte. Tamamen zararsız bir yazılım ancak, basılan tuşları heryerde algılamak için low level keyboard hook, clipboard değişikliklerini yakalamak için clipboard listener, metni çevirmek için de internet bağlantısı kullanıldı, yani program antivirüslere şüpheli görünebilir :) tabi dileyen kendisi koddan derleyebilir veya C derleyicisi olan birisne derletebilir.

     

  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Tugberk
    Tugberk's avatar
    Kayıt Tarihi: 04/Ekim/2009
    Erkek

    Öncelikle program SetWindowHookEx ile low level keyboard hook atıyor, low level hook'un farkı, processlere dll inject etmiyor, böylece dll içinde bir hatadan dolayı ilgisiz programlar crash olmuyor. Low level hook da, keyboard mesajları hook u atan exeye yollanır ve onun contextinde işlenir.

    Daha sonra program clipboard değiştiğinde bilgi almak için bir pencere yaratıyor (ekranda göstermiyor) ve SetClipboardViewer apisi ile, bu pencereyi clipboard listener olarak ayarlıyor.

    Bundan sonra aşağıdaki adımlar işliyor.

    1) kullanıcı right ctrl tuşuna basar

    2) low level hook fonksiyonuna tuş gelir, eğer ctrl ise, hook fonksiyonu o anda fokus olan pencerenin mesaj kuyruğuna ctrl+c yollar. Yani seçili bir metin varsa bu esnada kopyalanmış başka bir deyişle clipboard a atılmış olur. Ayrıca bu fonksiyon tuşun geldiği tarihi yazar bir yere.

    3) ctrl+c den dolayı bir metin kopyalandı, yani clipboard değişti, bununla ilgili mesaj alınır alınmaz, önce clipboard daki data text mi diye bakılır, ardından, bu mesajın geliş tarihine bakılır, tuşa basılma tarihi ile aynı ise, metin çevrilmek üzere translate thread a teslim edilir.

    4) translate thread ilgili metni google translate e yollar, çevrilmiş halini alır ekrana basar.

    Kodda ayrıca açıklamalar var buyrun.

    /*++
    
    Copyright (c) Tahribat 2001-2012. All rights reserved.
    
    Module Name:
    
        main.c
    
    Abstract:
    
        Right Ctrl tusuna basilinca secilen metini google translate ile cevirir,
    	cevrilmis metini mesaj kutusu ile gosterir.
    
    --*/
    
    #define _WIN32_WINNT 0x501
    #define _CRT_SECURE_NO_WARNINGS
    
    #define HOSTNAME "www.google.com"
    
    #include <Windows.h>
    #include <stdio.h>
    #include <time.h>
    #include "resource.h"
    
    HHOOK hHook;
    HANDLE hMutex;
    HWND hwnd, hNextWnd;
    HINSTANCE ghInstance;
    time_t tMsg;
    int Lock, ExitLock;
    char buffer[256] = {0};
    
    //
    // Bu request degisebilir simdilik bu sekilde calisiyor %s yerine metin gelecek
    //
    char request[4096] = 
    	"GET /?langpair=en|tr&text=%s HTTP/1.0\r\n"
    	"Host: translate.google.com\r\n"
    	"User-Agent: App/1.7\r\n\r\n";
    
    void ShowMessage(HWND hwndOwner, WCHAR *msg, WCHAR* capt)
    {
    	MSGBOXPARAMSW msgParam;
    	memset(&msgParam, 0, sizeof(msgParam));
    
    	msgParam.cbSize = sizeof(msgParam);
    	msgParam.hwndOwner = hwndOwner;
    	msgParam.hInstance = ghInstance;
    	msgParam.lpszText = msg;
    	msgParam.lpszCaption = capt;
    	msgParam.dwStyle = MB_OK | MB_USERICON;
    	msgParam.lpszIcon =  MAKEINTRESOURCEW(IDI_ICON1);
    	msgParam.dwLanguageId = LANG_TURKISH;
    
    	//
    	// Google translate iconu ile mesaji gostermek icin MessageBoxun gelismisi
    	//
    	MessageBoxIndirectW(&msgParam);
    }
    
    SOCKET GetConnectedSocket(const char* hostname, short port)
    {
        SOCKET client = 0;
        struct hostent *host = NULL;
        struct sockaddr_in  info = {0};
        
    	//
    	// Translate.google.com u coz ve baglan, bu fonksiyon bazen cok uzun
    	// sure donmuyor internet baglantisi sikintili ise
    	//
        if (!(host = gethostbyname(hostname))) 
        {
            return INVALID_SOCKET;
        }
    
        info.sin_family = AF_INET;
        info.sin_port   = htons((short)port);
        info.sin_addr   = *((struct in_addr *)host->h_addr);
    
        if (INVALID_SOCKET == (client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)))
        {
            return INVALID_SOCKET;
        }
    
        if (connect(client, (struct sockaddr *)&info, sizeof(struct sockaddr)))
        {
            closesocket(client);
            return INVALID_SOCKET;
        }
        return client;
    }
    
    void SendCtrlC(void)
    {
    	GUITHREADINFO tInfo;
    
    	memset(&tInfo, 0, sizeof(tInfo));
    	tInfo.cbSize = sizeof(tInfo);
    
    	GetGUIThreadInfo(0, &tInfo);
    
    	//
    	// Aslinda burda Ctrl yollamiyoruz sadece C yolluyoruz, cunku zaten
    	// Ctrl ye basilmis :) birakma kodundan once bu mesaji yolluyoruz boylece
    	// Ctrl+C ye basilmis, secili metin kopyalanmis oluyor
    	//
    	PostMessage (tInfo.hwndFocus, WM_KEYDOWN , 'C', 0);
    	PostMessage (tInfo.hwndFocus, WM_KEYUP , 'C', 0);
    }
    
    DWORD WINAPI TranslateThread(
    	LPVOID lpParameter
    	)
    {
    	int i, j, len = 0;
    	char *str, *ptr;
    	char buf[32*1024] = {0};
    	char shadow[1024] = {0};
    	WCHAR shadowU[1024] = {0};
    	char trChar[32] = "öÖşŞçÇıİğĞüÜ";
    	WCHAR trwChar[32] = L"öÖşŞçÇıİğĞüÜ";
    	GUITHREADINFO tInfo;
    	SOCKET sock = INVALID_SOCKET;
    
    	memset(&tInfo, 0, sizeof(tInfo));
    	tInfo.cbSize = sizeof(tInfo);
    
    	GetGUIThreadInfo(0, &tInfo);
    
    	if (buffer[0] == '\a')
    	{
    		MessageBoxW(tInfo.hwndFocus, 
    					L"Seçilen yazi 255 karakterden kısa olmadıdır",
    					L"Uyarı", 
    					48);
    		goto Exit;
    	}
    
    	//
    	// Oncelikle translate.google.com a baglanmis bir soket olustur
    	//
    	sock = GetConnectedSocket(HOSTNAME, 80);
    	if (sock == INVALID_SOCKET) {
    		MessageBoxW(tInfo.hwndFocus, L"İnternete Bağlanılamadı", L"Uyarı", 48);
    		goto Exit;
    	}
    
    	//
    	// Translate icin yollayacagimiz metindeki bazı karakterleri space ile
    	// degistir, yazilamayanlar yerine de _ koy
    	//
    	for (i=0; buffer[i]; i++)
    	{
    		if (buffer[i] == '\r' || buffer[i] == '\n' ||
    			buffer[i] == '\\' || buffer[i] == '%') 
    		{
    			buffer[i] = ' ';
    		}
    		else if (!isprint(buffer[i]))
    		{
    			buffer[i] = '_';
    		}
    
    		len += sprintf(shadow + len, "%%%X", (unsigned char)buffer[i]);
    	}
    
    	//
    	// Cevrilecek datayi yolla bakalim
    	//
    	len = sprintf(buf, request, shadow);
    	send(sock, buf, len, 0);
    
    	memset(buf, 0, sizeof(buf));
    	memset(shadow, 0, sizeof(shadow));
    	
    	len = 0;
    
    	//
    	// </html> i gorene kadar sayfayi yuklemeye devam et
    	//
    	while (TRUE)
    	{
    		int ret = 0;
    		ret = recv(sock, buf + len, sizeof(buf) - len, 0);
    		if (ret <= 0) {
    			break;
    		}
    		if (strstr(buf, "</Html>") || strstr(buf, "</html>")) {
    			break;
    		}
    		len += ret;
    	}
    
    	closesocket(sock);
    	str = buf;
    
    	//
    	// Burasi kodun en guvenilmez yeri, gelen sayfada cevrilmis metin #fff'">
    	// karakterlerinden sonra geliyor, ama yarin degisebilir bu :)
    	//
    	while (TRUE) 
    	{
    		str = strstr(str, "#fff'\">");
    		if (str == NULL) {
    			break;
    		}
    
    		ptr = strchr(str, '<');
    		if (ptr == NULL) {
    			break;
    		}
    		*ptr = 0;
    
    		sprintf(shadow + strlen(shadow), "%s ", str + strlen("#fff'\">"));
    		str = ptr + 1;
    	}
    
    	//
    	// Gelen stringi yani cevrilmis metni unicode a cevir ve ekrana bas
    	//
    	if (*shadow) {
    		int length = strlen(trChar);
    
    		for (i=0; shadow[i]; i++)
    		{
    			for (j=0; j<length; j++) 
    			{
    				if (shadow[i] == trChar[j]) {
    					shadowU[i] = trwChar[j];
    				}
    			}
    			
    			if (shadowU[i] == 0) {
    				shadowU[i] = shadow[i];
    			}
    		}
    		ShowMessage(tInfo.hwndFocus, shadowU, L"Google Translate");
    	}
    
    Exit:
    	Lock = 0;
    	memset(buffer, 0, sizeof(buffer));
    	return 0;
    }
    
    DWORD WINAPI ThreadExit(
    	LPVOID lpParameter
    	)
    {
    	GUITHREADINFO tInfo;
    
    	if (ExitLock) {
    		return 0;
    	}
    	ExitLock = 1;
    	
    	memset(&tInfo, 0, sizeof(tInfo));
    	tInfo.cbSize = sizeof(tInfo);
    
    	GetGUIThreadInfo(0, &tInfo);
    
    	if (MessageBoxW(tInfo.hwndFocus, 
    					L"Programdan çıkmak İstiyor musun?", 
    					L"Google Translate", 
    					MB_YESNOCANCEL | MB_ICONQUESTION
    					) == IDYES) {
    		SendMessage(hwnd, WM_CLOSE, 0, 0);
    	}
    
    	ExitLock = 0;
    	return 0;
    }
    
    LRESULT CALLBACK LowLevelKeyboardProc(
    	int nCode,
    	WPARAM wParam,
    	LPARAM lParam
    	)
    {
    	//
    	// Burasi hook proseduru, her tusa basildiginda bir kere calisir
    	//
    	KBDLLHOOKSTRUCT *kbhook = (KBDLLHOOKSTRUCT*)lParam;
    
    	//
    	// Right Ctrl tusu birakildiginda bu kod calisir, tus basilma zamanini
    	// kaydeder ve focus olan pencerenin mesaj kuyruguna Ctrl+C yollar
    	//
    	if (kbhook->vkCode == VK_RCONTROL)
    	{
    		if (wParam == WM_KEYUP) {
    			tMsg = time(NULL);
    			SendCtrlC();
    		}
    	}
    
    	//
    	// Basilmis tus F10 ise, cikis dialogunu soran threadi baslat
    	//
    	if (wParam == WM_KEYUP && kbhook->vkCode == VK_F10)
    	{
    		HANDLE hThread = CreateThread(NULL, 0, ThreadExit, NULL, 0, NULL);
    		CloseHandle(hThread);
    	}
    
    	return CallNextHookEx(NULL, nCode, wParam, lParam);
    }
    
    LRESULT CALLBACK WindowProcedure (
    	HWND hwnd, 
    	UINT message, 
    	WPARAM wParam, 
    	LPARAM lParam
    	)
    {
    	HGLOBAL hglb;
    	LPTSTR lptstr;
    	DWORD cbLen = 0;
    
    	//
    	// Clipboard degismis mesaji
    	//
    	if (message == WM_DRAWCLIPBOARD)
    	{
    		//
    		// Degisiklik bizden mi kaynaklaniyor, aksi halde return
    		//
    		if ((time(NULL) - tMsg) > 1)
    		{
    			return 0;
    		}
    
    		if (!OpenClipboard(NULL)) {
    			return 0;
    		}
    
    		//
    		// Clipboard daki data text mi, oyleyse oku, degilse return
    		//
    		if (!IsClipboardFormatAvailable(CF_TEXT)) {
    			EmptyClipboard();
    			CloseClipboard();
    			return 0;
    		}
    
    		hglb = GetClipboardData(CF_TEXT);
    		if (hglb == NULL) 
    		{
    			CloseClipboard();
    			return 0;
    		}
    
    		lptstr = (LPTSTR)GlobalLock(hglb);
    		if (lptstr == NULL) {
    			CloseClipboard();
    			return 0;
    		}
    
    		cbLen = strlen((char*)lptstr);
    		if (cbLen  < sizeof(buffer)) {
    			memcpy(buffer, lptstr, cbLen);
    		}
    		else {
    			buffer[0] = '\a';
    		}
    
    		GlobalUnlock(hglb);
    		CloseClipboard();
    
    		if (hNextWnd != NULL) {
    			SendMessage(hNextWnd, message, wParam, lParam);
    		}
    
    		//
    		// Data okundu, aktif bir ceviri islemi yoksa, ceviri threadini baslat
    		//
    		if (Lock == 0)
    		{
    			HANDLE hThread = CreateThread(NULL, 0, TranslateThread, NULL, 0, NULL);
    			CloseHandle(hThread);
    			Lock = 1;
    		}
    
    		return 0;
    	}
    	else if (message == WM_CHANGECBCHAIN)
    	{
    		//
    		// Bir baska viewer listeden cikti, artik clipboard degisiklikleri
    		// ona gitmeyecek, bizde onu aradan cikarip listeyi duzenliyoruz
    		//
    		if ((HWND) wParam == hNextWnd) {
    			hNextWnd = (HWND) lParam; 
    		}
    		else if (hNextWnd != NULL) {
    			SendMessage(hNextWnd, message, wParam, lParam);
    		}
    		return 0;
    	}
    	else if (message == WM_CLOSE)
    	{
    		//
    		// Temizlik islemlerini yap programi kapat
    		//
    		ChangeClipboardChain(hwnd, hNextWnd);
    		WSACleanup();
    		UnhookWindowsHookEx(hHook);
    		CloseHandle(hMutex);
    		ExitProcess(0);
    	}
    	else {
    		return DefWindowProc (hwnd, message, wParam, lParam);
    	}
    }
    
    int WINAPI WinMain (
    	HINSTANCE hInstance,
    	HINSTANCE hPrevInstance,
    	LPSTR lpCmdLine,
    	int nCmdShow
    	)
    {
    	MSG messages;
    	WNDCLASSEX wincl;
    	CHAR szClassName[] = "WindowsApp";
    	WSADATA wsaData;
    
    	ghInstance = hInstance;
    
    	//
    	// Programin ayni anda sadece 1 orneginin calismasi icin
    	//
    	if ((hMutex = CreateMutex(NULL, FALSE, "Translate"))&& 
    		GetLastError() == ERROR_ALREADY_EXISTS)
    	{
    		MessageBoxW(0, 
    					L"Bu programdan sadece bir örnek çalıştırılabilir", 
    					L"Uyarı", 
    					48);
    		return 0;
    	}
    
    	ShowMessage(0, 
    				L"Google Instant Translate by D.K.\nÇıkmak için F10'a basın.", 
    				L"Google Translate");
    
    	WSAStartup(MAKEWORD(2,2), &wsaData);
    
    	//
    	// LowLevel keyboard hook atiliyor, F10 ve Ctrl i yakalamak icin
    	//
    	hHook = SetWindowsHookEx (	WH_KEYBOARD_LL,
    								LowLevelKeyboardProc,
    								hInstance,
    								0);
    	if (hHook == NULL) {
    		goto ErrorExit;
    	}
    
    	//
    	// Gorunmeyen pencereyi yarat, window mesajlarını alabilmemiz icin
    	//
    	wincl.hInstance = hInstance;
    	wincl.lpszClassName = szClassName;
    	wincl.lpfnWndProc = WindowProcedure;
    	wincl.style = CS_DBLCLKS;
    	wincl.cbSize = sizeof (WNDCLASSEX);
    
    	wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    	wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    	wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    	wincl.lpszMenuName = NULL;
    	wincl.cbClsExtra = 0;
    	wincl.cbWndExtra = 0; 
    	wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    
    	if (!RegisterClassEx (&wincl)) {
    		goto ErrorExit;
    	}
    
    	hwnd = CreateWindowEx (	0,
    							szClassName,
    							"Windows App",
    							WS_OVERLAPPEDWINDOW,
    							CW_USEDEFAULT,
    							CW_USEDEFAULT,
    							0,
    							0,
    							HWND_DESKTOP,
    							NULL,
    							hInstance,
    							NULL
    							);
    	if (hwnd == NULL) {
    		goto ErrorExit;
    	}
    
    	//
    	// Clipboard viewer ekle boylece clipboard degistiginde bize mesaj gelecek
    	//
    	hNextWnd = SetClipboardViewer(hwnd);
    	if (hNextWnd == NULL)
    	{
    		if (GetLastError() != ERROR_SUCCESS) {
    			goto ErrorExit;
    		}
    	}
    
    	//
    	// Mesaj dongusune gir, bu donguden program sonlanana kadar cikilmayacak
    	// WM_CLOSE mesajinin handle edildigi yerde program sonlandiriliyor
    	//
    	while (GetMessage (&messages, NULL, 0, 0))
    	{
    		TranslateMessage(&messages);
    		DispatchMessage(&messages);
    	}
    	
    	//
    	// Hata durumunda ortaligi temizle tozol
    	//
    ErrorExit:
    	WSACleanup();
    	CloseHandle(hMutex);
    	UnhookWindowsHookEx(hHook);
    	return 1;
    }
    Tugberk tarafından 12/Ara/12 20:34 tarihinde düzenlenmiştir
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    erdiburak
    erdiburak's avatar
    Kayıt Tarihi: 09/Ocak/2010
    Erkek

    Güzel ve mantıklı Eline sağlık hocam

     

    Edit: Parola nedir ?

    erdiburak tarafından 12/Ara/12 20:29 tarihinde düzenlenmiştir

    | GTP | TBT | Desinatör | icrypex.net | Turknet = XMP85HC93OKM
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    hsyN
    hsyN's avatar
    Kayıt Tarihi: 15/Şubat/2011
    Erkek

    küçücük fıçıcık içi dolu turşucuk :) çok da mütevazısın hocam eline sağlık


    test 1 2
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    anarsistherif
    anarsistherif's avatar
    Kayıt Tarihi: 27/Ağustos/2009
    Erkek

    aabi ben bunu düşünmüştüm. neyse kodlamama gerek kalmadı ehehe

    pass: tahribat

    anarsistherif tarafından 12/Ara/12 20:33 tarihinde düzenlenmiştir

    =)
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    erdiburak
    erdiburak's avatar
    Kayıt Tarihi: 09/Ocak/2010
    Erkek
    schwarzseherisch bunu yazdı

    aabi ben bunu düşünmüştüm. neyse kodlamama gerek kalmadı ehehe

    pass: tahribat

    Sagol hoca yanlış yazmışım demekkine :D


    | GTP | TBT | Desinatör | icrypex.net | Turknet = XMP85HC93OKM
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    nessaj
    nessaj's avatar
    Kayıt Tarihi: 03/Mayıs/2010
    Erkek

    unfocus olunca kapansın pencere , rahat olur.

  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Sharp
    Sharp's avatar
    Kayıt Tarihi: 02/Temmuz/2007
    Erkek

    sen insansan diğer yazılımcılar hayvan


    www.yesilgrow.com - Growshop
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    MiaD06
    MiaD06's avatar
    Kayıt Tarihi: 28/Haziran/2012
    Erkek

    güzel fikir saol hocam paylaşım için 


    Tek isteğim MiaD'ımın dolması .. cart curt.
  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    aliyk
    aliyk's avatar
    Kayıt Tarihi: 07/Mayıs/2007
    Erkek

    Hocam sakın baltalıyorum diye sanma ama bu işi yapan firefoxun greasemonkey scripti var

    sadece bilgilendirme babında

    http://userscripts.org/scripts/show/36898 google translator tooltip

    http://b1212.hizliresim.com/14/d/gur1g.jpg


    Lekum Dinikum Veliye Din ...
  11. KısayolKısayol reportŞikayet pmÖzel Mesaj
    fatX
    fatX's avatar
    Kayıt Tarihi: 06/Mart/2007
    Erkek

    Çok iyimiş de klavyemde sağ ctrl tuşu yok mesela sol ctrl tuşu + mouse'un seçtiği kelimeyi falan çevireydiiyidi :/

    Anlık olarak bilinmeyen ingilizce kelimeyi görmek ve görüp öğrenmek için çok ideal.


    Altan naptın oğlum :|
Toplam Hit: 12317 Toplam Mesaj: 66