Windows
29.05.2018
Yazar: Admin
Bilgisayarımızda bulunan programlardan bir veya daha fazlasını tek bir komutla çalıştırmak için batch dosyası (.bat) kullanabiliriz.
Windows Notepad programı ile yeni bir dosya açıp aşağıdaki verileri içine kopyalayıp dosyayı bilgisayarınıza .bat uzantısı ile kaydediniz.
@echo Off start "" "C:\\Windows\\Explorer.exe" start "" "C:\\Windows\\System32\\notepad.exe" start "" "C:\\Windows\\System32\\calc.exe" exit
Dosyaya "calistir.bat" adı verir ve çift tıklayarak çalıştırırsak, dosya içinde bulunan Windows Explorer, Notepad ve Hesap programları sırasıyla otomatik olarak çalıştırılır.
Çalıştırmak istediğiniz programları bu dosyaya ekleyebilirsiniz.
Winapi
27.05.2018
Yazar: Admin
Windows API'de form üzerine bir resim eklemek için Static kontrol kullanabiliriz. Static kontrol oluştururken SS_ICON parametresini eklememiz gerekir.
Proje içinde oluşturacağımız bir resource dosyasına (resource.rc) dahil ettiğimiz bir resim dosyasını LoadImage() fonksiyonu ile okutarak ve STM_SETIMAGE mesajını static kontrole göndererek, penceremize bir resim ekleyebiliriz.
1. Öncelikle Burada gösterildiği gibi bir Windows API projesi oluşturalım. Projeyle birlikte otomatik olarak oluşturulan main.c dosyası içine aşağıda gösterilen kodları ekleyelim:
#include "resource.h"
HWND hwndStaticImage;
HANDLE iconBG;
case WM_CREATE:
hwndStaticImage = CreateWindowEx(WS_EX_TRANSPARENT, "STATIC", "", WS_CHILD | WS_VISIBLE | SS_ICON, 100, 100, 100, 120,
hwnd, 0, NULL, NULL);
iconBG = LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICONBG), IMAGE_ICON, 100, 120, LR_SHARED);
SendMessage(hwndStaticImage, STM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)iconBG);
break;
Static kontrol oluştururken SS_ICON parametresinin eklendiğine dikkat ediniz.
Proje içinde oluşturacağımız bir resource dosyasına (resource.rc) dahil ettiğimiz bir resim dosyası LoadImage() fonksiyonu ile okutulur.
Static kontrol pencersine STM_SETIMAGE mesajı gönderilerek resim static kontrole atanır.
Yukarıdaki kodları eklediğimizde, main.c dosyasının en son hali aşağıdaki şekilde olacaktır.
main.c
#if defined(UNICODE) && !defined(_UNICODE)
#define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
#define UNICODE
#endif
#include
#include
#include "resource.h"
/* Declare Windows procedure */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
/* Make the class name into a global variable */
TCHAR szClassName[ ] = _T("DenemeApp");
HWND hwndStaticImage;
HANDLE iconBG;
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
HWND hwnd; /* This is the handle for our window */
MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */
/* The Window structure */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
wincl.style = CS_DBLCLKS; /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);
/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* No menu */
wincl.cbClsExtra = 0; /* No extra bytes after the window class */
wincl.cbWndExtra = 0; /* structure or the window instance */
/* Use Windows's default colour as the background of the window */
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&wincl))
return 0;
/* The class is registered, let's create the program*/
hwnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
_T("Deneme Uygulaması"), /* Title Text */
WS_OVERLAPPEDWINDOW, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
544, /* The programs width */
375, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
NULL, /* No menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);
/* Make the window visible on the screen */
ShowWindow (hwnd, nCmdShow);
/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}
/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}
/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* handle the messages */
{
case WM_CREATE:
hwndStaticImage = CreateWindowEx(WS_EX_TRANSPARENT, "STATIC", "", WS_CHILD | WS_VISIBLE | SS_ICON, 100, 100, 100, 120,
hwnd, 0, NULL, NULL);
iconBG = LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICONBG), IMAGE_ICON, 100, 120, LR_SHARED);
SendMessage(hwndStaticImage, STM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)iconBG);
break;
case WM_DESTROY:
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
2. resource.h adlı bir dosya oluşturarak içeriğini aşağıdaki şekilde düzenleyelim.
resource.h
#include <windows.h>
#define IDI_ICONBG 1001
3. resource.rc adlı bir dosya oluşturarak içeriğini aşağıdaki şekilde düzenleyelim.
resource.rc
#include "resource.h"
IDI_ICONBG ICON "bglogo.ico"
4. Program kaynak kod dosyalarının bulunduğu dizinde bglogo.ico adlı bir resim dosyası oluşturalım.
Yaptığımız işlemler sonucunda, proje içinde yer alan dosyalar ve IDE içindeki görünümü aşağıdaki fotoğraftaki şekilde olacaktır.
Program derleyip çalıştırdığımızda aşağıdakine benzer bir ekran görüntüsü karşımıza gelecektir:
Winapi
26.05.2018
Yazar: Admin
Windows API'de bir Buton kontrolü üzerine resim ve yazıyı birlikte eklemek için owner-drawn yöntemini kullanabiliriz. Bu durumda, butonun tüm çizim işlemini manuel olarak yapmamız gerekir.
Butonun yer aldığı ana pencereye gönderilen WM_DRAWITEM mesajını kullanarak bu işlemi gerçekleştirebiliriz. WM_DRAWITEM mesajının wParam parametresi mesajı gönderen kontrolün tanımlayıcısını (IDC_BUTTON), lParam parametresi ise çizilecek kontrol ve çizim türü hakkında bilgiler içeren DRAWITEMSTRUCT yapısını gösteren bir pointer içerir.
1. Öncelikle Burada gösterildiği gibi bir Windows API projesi oluşturalım. Projeyle birlikte otomatik olarak oluşturulan main.c dosyası içine aşağıda gösterilen kodları ekleyelim:
#include "resource.h" /* resource.h başlık dosyasını dahil etme */
HWND hwndButtonAbout; /* Buton için değişken oluşturma */
HANDLE iconAbout; /* icon için Handle oluşturma */
case WM_CREATE:
hwndButtonAbout = CreateWindowEx(0, "BUTTON", "",
WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 100, 100, 120, 30,
hwnd, (HMENU) IDC_BUTTON, NULL, NULL);
break;
case WM_DRAWITEM:
{
switch ((UINT)wParam)
{
case IDC_BUTTON:
{
LPDRAWITEMSTRUCT lpdis = (DRAWITEMSTRUCT*)lParam;
SIZE size;
LPSTR btnString = "Hakkında";
SetTextColor(lpdis->hDC, RGB(0, 0, 0));
SetBkColor(lpdis->hDC, RGB(236, 236, 236));
GetTextExtentPoint32(lpdis->hDC, btnString, strlen(btnString), &size);
ExtTextOut(lpdis->hDC, ((lpdis->rcItem.right - lpdis->rcItem.left) - size.cx) / 2,
((lpdis->rcItem.bottom - lpdis->rcItem.top) - size.cy) / 2,
ETO_OPAQUE | ETO_CLIPPED, &lpdis->rcItem, btnString, strlen(btnString), NULL);
iconAbout = LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICONABOUT), IMAGE_ICON, 16, 16, LR_SHARED);
DrawIconEx(lpdis->hDC, 5, ((lpdis->rcItem.bottom - lpdis->rcItem.top) - 16) / 2, (HICON)iconAbout, 16, 16, 0, 0, DI_NORMAL);
DrawEdge(lpdis->hDC, &lpdis->rcItem, (lpdis->itemState & ODS_SELECTED ? EDGE_SUNKEN : EDGE_RAISED), BF_RECT);
return TRUE;
}
break;
}
}
Butonu oluştururken BS_OWNERDRAW parametresinin eklendiğine dikkat ediniz.
Buton oluşturulurken içinde bulunduğu pencereye WM_DRAWITEM mesajı gönderir. wParam parametresi ile mesajı gönderen kontrolün IDC_BUTTON id değerine sahip olduğu kontrol edildikten sonra, oluşturulan DRAWITEMSTRUCT yapı değişkenine lParam değerleri aktarılır.
SetTextColor() fonksiyonu ile butonun yazı rengi SetBkColor() fonksiyonu ile butonun arka plan rengi belirlenir.
GetTextExtentPoint32() ile yazılacak metin uzunluğu belirlenir.
ExtTextOut() fonksiyonu metin buton üzerine yazılır.
Proje içinde oluşturacağımız bir resource dosyasına (resource.rc) dahil ettiğimiz bir resim dosyasını LoadImage() fonksiyonu ile okutulur.
DrawIconEx() fonksiyonu resim buton üzerine çizilir.
DrawEdge() fonksiyonu ile butonun durumuna bağlı olarak kenar çizgileri çizilir.
Yukarıdaki kodları eklediğimizde, main.c dosyasının en son hali aşağıdaki şekilde olacaktır.
main.c
#if defined(UNICODE) && !defined(_UNICODE)
#define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
#define UNICODE
#endif
#include <tchar.h>
#include <windows.h>
#include "resource.h"
/* Declare Windows procedure */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
/* Make the class name into a global variable */
TCHAR szClassName[ ] = _T("DenemeApp");
HWND hwndButtonAbout;
HANDLE iconAbout;
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
HWND hwnd; /* This is the handle for our window */
MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */
/* The Window structure */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
wincl.style = CS_DBLCLKS; /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);
/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* No menu */
wincl.cbClsExtra = 0; /* No extra bytes after the window class */
wincl.cbWndExtra = 0; /* structure or the window instance */
/* Use Windows's default colour as the background of the window */
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&wincl))
return 0;
/* The class is registered, let's create the program*/
hwnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
_T("Deneme Uygulaması"), /* Title Text */
WS_OVERLAPPEDWINDOW, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
544, /* The programs width */
375, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
NULL, /* No menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);
/* Make the window visible on the screen */
ShowWindow (hwnd, nCmdShow);
/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}
/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}
/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* handle the messages */
{
case WM_CREATE:
hwndButtonAbout = CreateWindowEx(0, "BUTTON", "",
WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 100, 100, 120, 30,
hwnd, (HMENU) IDC_BUTTON, NULL, NULL);
break;
case WM_DRAWITEM:
{
switch ((UINT)wParam)
{
case IDC_BUTTON:
{
LPDRAWITEMSTRUCT lpdis = (DRAWITEMSTRUCT*)lParam;
SIZE size;
LPSTR btnString = "Hakkında";
SetTextColor(lpdis->hDC, RGB(0, 0, 0));
SetBkColor(lpdis->hDC, RGB(236, 236, 236));
GetTextExtentPoint32(lpdis->hDC, btnString, strlen(btnString), &size);
ExtTextOut(lpdis->hDC, ((lpdis->rcItem.right - lpdis->rcItem.left) - size.cx) / 2,
((lpdis->rcItem.bottom - lpdis->rcItem.top) - size.cy) / 2,
ETO_OPAQUE | ETO_CLIPPED, &lpdis->rcItem, btnString, strlen(btnString), NULL);
iconAbout = LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICONABOUT), IMAGE_ICON, 16, 16, LR_SHARED);
DrawIconEx(lpdis->hDC, 5, ((lpdis->rcItem.bottom - lpdis->rcItem.top) - 16) / 2, (HICON)iconAbout, 16, 16, 0, 0, DI_NORMAL);
DrawEdge(lpdis->hDC, &lpdis->rcItem, (lpdis->itemState & ODS_SELECTED ? EDGE_SUNKEN : EDGE_RAISED), BF_RECT);
return TRUE;
}
break;
}
}
case WM_DESTROY:
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
2. resource.h adlı bir dosya oluşturarak içeriğini aşağıdaki şekilde düzenleyelim.
resource.h
#include <windows.h>
#define IDC_BUTTON 101
#define IDI_ICONABOUT 1001
3. resource.rc adlı bir dosya oluşturarak içeriğini aşağıdaki şekilde düzenleyelim.
resource.rc
#include "resource.h"
IDI_ICONABOUT ICON "about.ico"
4. Program kaynak kod dosyalarının bulunduğu dizinde about.ico adlı bir resim dosyası oluşturalım.
Yaptığımız işlemler sonucunda, proje içinde yer alan dosyalar ve IDE içindeki görünümü aşağıdaki fotoğraftaki şekilde olacaktır.
Program derleyip çalıştırdığımızda aşağıdakine benzer bir ekran görüntüsü karşımıza gelecektir:
Winapi
25.05.2018
Yazar: Admin
Proje içinde oluşturacağımız bir resource dosyasına (resource.rc) dahil ettiğimiz bir resim dosyasını LoadImage() fonksiyonu ile okutarak ve BM_SETIMAGE mesajını buton kontrolüne göndererek, buton kontrolüne bir resim ekleyebiliriz.
1. Öncelikle Burada gösterildiği gibi bir Windows API projesi oluşturalım. Projeyle birlikte otomatik olarak oluşturulan main.c dosyası içine aşağıda gösterilen kodları ekleyelim:
#include "resource.h" /* resource.h başlık dosyasını dahil etme */
HWND hwndButtonAbout; /* Buton için değişken oluşturma */
HANDLE iconAbout; /* icon için Handle oluşturma */
WM_CREATE:
/* Buton penceresi oluşturma */
hwndButtonAbout = CreateWindowEx(0, "BUTTON", "",
WS_CHILD | WS_VISIBLE | BS_ICON, 100, 100, 32, 32,
hwnd, (HMENU) IDC_BUTTON, NULL, NULL);
/* resource.rc dosyasından about.ico dosyasını yükleme */
iconAbout = LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICONABOUT), IMAGE_ICON, 16, 16, LR_SHARED);
/* Butona resim atama */
SendMessage(hwndButtonAbout, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)iconAbout);
break;
Yukarıdaki kodları eklediğimizde, main.c dosyasının en son hali aşağıdaki şekilde olacaktır.
main.c
#if defined(UNICODE) && !defined(_UNICODE)
#define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
#define UNICODE
#endif
#include <tchar.h>
#include <windows.h>
#include "resource.h"
/* Declare Windows procedure */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
/* Make the class name into a global variable */
TCHAR szClassName[ ] = _T("DenemeApp");
HWND hwndButtonAbout;
HANDLE iconAbout;
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
HWND hwnd; /* This is the handle for our window */
MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */
/* The Window structure */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
wincl.style = CS_DBLCLKS; /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);
/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* No menu */
wincl.cbClsExtra = 0; /* No extra bytes after the window class */
wincl.cbWndExtra = 0; /* structure or the window instance */
/* Use Windows's default colour as the background of the window */
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&wincl))
return 0;
/* The class is registered, let's create the program*/
hwnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
_T("Deneme Uygulaması"), /* Title Text */
WS_OVERLAPPEDWINDOW, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
544, /* The programs width */
375, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
NULL, /* No menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);
/* Make the window visible on the screen */
ShowWindow (hwnd, nCmdShow);
/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}
/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}
/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* handle the messages */
{
case WM_CREATE:
hwndButtonAbout = CreateWindowEx(0, "BUTTON", "",
WS_CHILD | WS_VISIBLE | BS_ICON, 100, 100, 32, 32,
hwnd, (HMENU) IDC_BUTTON, NULL, NULL);
iconAbout = LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICONABOUT), IMAGE_ICON, 16, 16, LR_SHARED);
SendMessage(hwndButtonAbout, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)iconAbout);
break;
case WM_DESTROY:
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
2. resource.h adlı bir dosya oluşturarak içeriğini aşağıdaki şekilde düzenleyelim.
resource.h
#include <windows.h>
#define IDC_BUTTON 101
#define IDI_ICONABOUT 1001
3. resource.rc adlı bir dosya oluşturarak içeriğini aşağıdaki şekilde düzenleyelim.
resource.rc
#include "resource.h"
IDI_ICONABOUT ICON "about.ico"
4. Program kaynak kod dosyalarının bulunduğu dizinde about.ico adlı bir resim dosyası oluşturalım.
Yaptığımız işlemler sonucunda, proje içinde yer alan dosyalar ve IDE içindeki görünümü aşağıdaki fotoğraftaki şekilde olacaktır.
Program derleyip çalıştırdığımızda aşağıdakine benzer bir ekran görüntüsü karşımıza gelecektir:
Winapi
03.05.2018
Yazar: Admin
Windows API ile yaptığımız programın bazen sadece bir defa çalışmasını sağlamak isteyebiliriz.
Bu işlemi gerçekleştirmek için, Windows CreateMutex() fonksiyonunu kullanabiliriz.
HANDLE WINAPI CreateMutex(
_In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes,
_In_ BOOL bInitialOwner,
_In_opt_ LPCTSTR lpName
);
Programı çalıştırdığımızda, başlangıçta kullanılan CreateMutex() fonksiyonu başarılı bir şekilde işlem yaparsa, yeni bir mutex nesnesi oluşturur ve bu nesneyi gösteren bir HANDLE geri döndürür. Eğer fonksiyon düzgün bir şekilde çalışmazsa, NULL bir değer geri döndürür.
HANDLE hMutex;
hMutex = CreateMutex(NULL, TRUE, TEXT("MyApplication"));
Yukarıda yer alan "MyApplication" ifadesinin yerine herhangi bir karakter dizisi kullanabiliriz.
Eğer daha önceden CreateMutex() fonksiyonu ile lpName parametresine bir değer atanarak isimli bir mutex nesnesi oluşturulduysa, CreateMutex() fonksiyonunu ikinci kez kullandığımızda, mevcut mutex nesnesinin HANDLE değerini geri döndürür.
CreateMutex() fonksiyonundan sonra, GetLastError() fonksiyonunu kullandığımızda ise, GetLastError() fonksiyonu ERROR_ALREADY_EXISTS değerini geri döndürür.
GetLastError() fonksiyonunun ERROR_ALREADY_EXISTS değerini geri döndürdüğü tespit edildiğinde, CloseHandle() fonksiyonu ile yeni oluşturulan mutex nesnesi kapatılır ve programdan çıkılarak, programın çalışması sona erdirilir.
HANDLE hMutex;
hMutex = CreateMutex(NULL, TRUE, TEXT("NitrasApp"));
if (GetLastError() == ERROR_ALREADY_EXISTS) {
CloseHandle(hMutex);
return 0;
}
Programın son hali aşağıdaki şekilde olacaktır:
#include <windows.h>
/* Windows fonksiyon bildirimi yapar */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
/* Sınıf adını global bir değişkene atar */
char szClassName[ ] = "WinAPIWindowsApp";
/* HINSTANCE cinsinden global bir değişken bildirimi */
HINSTANCE ghInst;
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
HWND hwndMain; /* Program penceresine ait Handle */
MSG messages; /* Programa gönderilen mesajların kaydedildiği yer */
WNDCLASSEX wincl; /* Pencere değerlerini içeren yapı */
HANDLE hMutex;
hMutex = CreateMutex(NULL, TRUE, TEXT("NitrasApp"));
if (GetLastError() == ERROR_ALREADY_EXISTS) {
CloseHandle(hMutex);
return 0;
}
/* Programın bellekteki halinin Handle değeri global bir değişkene atanır */
ghInst = hThisInstance;
/* Pencere yapısına değer atama */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* Bu fonksiyon Windows tarafından çağrılır */
wincl.style = CS_DBLCLKS; /* Çift tıklamaları algılar */
wincl.cbSize = sizeof (WNDCLASSEX);
/* Aktif ikon ve fare göstergesini kullanır */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* Menü olmadığını gösterir */
wincl.cbClsExtra = 0; /* Pencere sınıfından sonra ekstra byte olmadığını gösterir */
wincl.cbWndExtra = 0; /* Yapı veya pencerenin instance değeri */
/* Pencerenin arka planı için Windows geçerli rengini kullanır */
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
/* Pencere sınıfını kaydeder, hata oluşursa program sona erer */
if (!RegisterClassEx (&wincl)) return 0;
/* Sınıf kaydolmuştur, program oluşturulur */
hwndMain = CreateWindowEx (
0,
szClassName,
"WinAPI Temel Program",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
544,
375,
HWND_DESKTOP,
NULL,
hThisInstance,
NULL
);
/* Pencere oluşturmada problem olursa programı sona erdirir. */
if (!hwndMain) return 0;
/* Pencerenin ekranda görünmesini sağlar. */
ShowWindow (hwndMain, nCmdShow);
/* Pencereyi günceller */
UpdateWindow(hwndMain);
/* Message döngüsünü çalıştırır. GetMessage() 0 değeri verene kadar devam eder.*/
while (GetMessage (&messages, NULL, 0, 0) > 0)
{
/* Sanal tuş mesajlarını karakter mesajlarına çevirir. */
TranslateMessage(&messages);
/* Mesajları WindowProcedure() fonksiyonuna gönderir. */
DispatchMessage(&messages);
}
CloseHandle(hMutex);
/* Program dönüş değeri 0'dır - Bu değeri PostQuitMessage() verir. */
return messages.wParam;
}
/* Bu fonksiyon Windows'un DispatchMessage() fonksiyonu tarafından çağrılır. */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* Mesajlara gerekli işlemi yapar. */
{
case WM_DESTROY:
PostQuitMessage (0); /* WM_QUIT değerini mesaj kuyruğuna gönderir */
break;
default: /* İşlem yapmadığımız mesajlar için */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
Winapi
30.04.2018
Yazar: Admin
Windows API ile program yaparken, programın ana penceresinin yeniden boyutlandırılmasını ve başlık çubuğunda yer alan maksimum boyuta getirme butonunun tüm ekranı kaplamasını engellemek isteyebiliriz.
Bu işlemi gerçekleştirmek için, Windows CreateWindowEx() fonksiyonunun dwStyle parametresini kullanabiliriz.
Burada yer alan örnek Windows API programında dwstyle için atanan WS_OVERLAPPEDWINDOW değeri aşağıda verilen tüm değerleri kapsamaktadır.
WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX
Bu haliyle program ana penceresi yeniden boyutlandırılabilmekte ve maksimum butonu kullanılabilmektedir.
İstediğimiz kısıtlamaları uygulamak için, WS_OVERLAPPEDWINDOW değeri yerine aşağıdaki ifadeyi kullanmak işimizi görecektir:
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
Programın son hali aşağıdaki şekilde olacaktır:
#include <windows.h>
/* Windows fonksiyon bildirimi yapar */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
/* Sınıf adını global bir değişkene atar */
char szClassName[ ] = "WinAPIWindowsApp";
/* HINSTANCE cinsinden global bir değişken bildirimi */
HINSTANCE ghInst;
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
HWND hwndMain; /* Program penceresine ait Handle */
MSG messages; /* Programa gönderilen mesajların kaydedildiği yer */
WNDCLASSEX wincl; /* Pencere değerlerini içeren yapı */
/* Programın bellekteki halinin Handle değeri global bir değişkene atanır */
ghInst = hThisInstance;
/* Pencere yapısına değer atama */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* Bu fonksiyon Windows tarafından çağrılır */
wincl.style = CS_DBLCLKS; /* Çift tıklamaları algılar */
wincl.cbSize = sizeof (WNDCLASSEX);
/* Aktif ikon ve fare göstergesini kullanır */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* Menü olmadığını gösterir */
wincl.cbClsExtra = 0; /* Pencere sınıfından sonra ekstra byte olmadığını gösterir */
wincl.cbWndExtra = 0; /* Yapı veya pencerenin instance değeri */
/* Pencerenin arka planı için Windows geçerli rengini kullanır */
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
/* Pencere sınıfını kaydeder, hata oluşursa program sona erer */
if (!RegisterClassEx (&wincl)) return 0;
/* Sınıf kaydolmuştur, program oluşturulur */
hwndMain = CreateWindowEx (
0,
szClassName,
"WinAPI Temel Program",
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
CW_USEDEFAULT,
CW_USEDEFAULT,
544,
375,
HWND_DESKTOP,
NULL,
hThisInstance,
NULL
);
/* Pencere oluşturmada problem olursa programı sona erdirir. */
if (!hwndMain) return 0;
/* Pencerenin ekranda görünmesini sağlar. */
ShowWindow (hwndMain, nCmdShow);
/* Pencereyi günceller */
UpdateWindow(hwndMain);
/* Message döngüsünü çalıştırır. GetMessage() 0 değeri verene kadar devam eder.*/
while (GetMessage (&messages, NULL, 0, 0) > 0)
{
/* Sanal tuş mesajlarını karakter mesajlarına çevirir. */
TranslateMessage(&messages);
/* Mesajları WindowProcedure() fonksiyonuna gönderir. */
DispatchMessage(&messages);
}
/* Program dönüş değeri 0'dır - Bu değeri PostQuitMessage() verir. */
return messages.wParam;
}
/* Bu fonksiyon Windows'un DispatchMessage() fonksiyonu tarafından çağrılır. */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* Mesajlara gerekli işlemi yapar. */
{
case WM_DESTROY:
PostQuitMessage (0); /* WM_QUIT değerini mesaj kuyruğuna gönderir */
break;
default: /* İşlem yapmadığımız mesajlar için */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
Php
09.12.2016
Yazar: Admin
Web sitenize eklediğiniz yeni makale veya haberleri Facebook hesabınızdaki bir sayfaya da eklemek istediğinizde, aynı işlemi ikinci kez yapmak zaman ve iş gücü kaybına neden olmaktadır. Bu sorunu gidermek amacıyla, yeni eklenen makale veya haberleri herhangi bir işlem yapmadan Facebook hesabınızdaki bir sayfaya eklemek için, Facebook PHP SDK paketini kullanabilirsiniz.
1. İşlemleri gerçekleştirmek için öncelikle, sistem gereksiminlerinizi kontrol edin:
a. PHP 5.4 veya daha gelişmiş bir sürümün bilgisayarınızda kurulu olması gerekir.
Eğer bilgisayarınızda PHP kurulu değilse, WampServer kullanarak bilgisayarınızda kuracağınız lokal sunucu ile bu işlemi gerçekleştirebilirsiniz.
b. Mbstring uzantısının aktif olduğunu kontrol edin.
2. Facebook PHP SDK paketini bilgisayarınıza kurun.
Bu işlemi otomatik olarak Composer yoluyla veya manuel olarak Facebook PHP SDK paketini indirip kurarak 2 farklı yöntemle gerçekleştirebilirsiniz.
a. Composer yoluyla otomatik olarak kurma
Bu işlem için:
(1) Web sitenizin yer aldığı ana dizin içinde composer.json adlı bir metin dosyası oluşturarak içine aşağıdaki satırları ekleyin:
{ "require" : { "facebook/graph-sdk" : "~5.0" } }
(2) https://getcomposer.org/ adresindeki Composer-Setup.exe dosyasını indirin, çalıştırın ve kurun. Kurulum işlemi bittikten sonra, komut istemi (dos penceresinde) ile ana dizinde iken aşağıdaki komutu yazdığınızda, en son Composer sürümü indirilerek içinde bulunduğunuz aktif dizin altında aşağıdaki dizin yapısı oluşturulur.
composer install
WampServer C sürücüsünde kurulu ise, Web sitenizin ana dizini, benimsitem adlı klasörde bulunan site için otomatik olarak oluşturulacak vendor dizisi yol tanımı aşağıdaki şekilde olacaktır:
C:\\wamp\\www\\benimsitem\\vendor
(3) vendor dizini içinde bulunan ve Composer otomatik yüklemesini yapan autoload.php dosyasını kodlarınıza dahil etmek için aşağıdaki komut satırını PHP kodlarınızın başına ekleyin:
require_once __DIR__ . '/vendor/autoload.php';
b. Manuel olarak Facebook PHP SDK paketini indirip kurma (Biz bu yöntemi tercih edeceğiz)
(1) Facebook PHP SDK paketini indirin.
Dosyayı açtıktan sonra, src dizinini kopyalayarak ana dizin altına yapıştırın ve src dizininin adını fbsrc olarak değiştirin (Facebook ile ilgili bir dizin olduğunu belirlemek için, gerekli değildir).
C:\\wamp\\www\\benimsitem\\fbsrc
(2) fbsrc/Facebook dizini içinde bulunan ve otomatik yükleme yapan autoload.php dosyasını kodlarınıza dahil etmek için aşağıdaki komut satırını PHP kodlarınızın başına ekleyin:require_once __DIR__ . '/fbsrc/Facebook/autoload.php';
3. Facebook Geliştiricileri sitesine giderek yeni bir Facebook uygulaması oluşturun.a. "Yeni Bir Uygulama Oluştur" butonuna basın.
b. Karşınıza gelen pencerede "Ekran adı" için bir değer girip, bir kategori seçtikten sonra "Uygulama Kodu Oluştur" butonuna tıklayın. İletişim e-posta adresi otomatik olarak çıkar.
c. Karşınıza gelen pencerede, güvenlik kodunu girdikten sonra, "Gönder" butonuna basın.
d. Böylece yeni bir Facebook uygulaması oluşturulmuş olur. Sol taraftaki menü seçeneğinden "Pano" seçeneğine tıkladığınızda;
Ekranda, API Sürümü, Uygulama Kodu ve Uygulama Gizli Anahtarı bg-infolerini görebilirsiniz. Bu bg-infoleri önümüzdeki safhalarda kullanacağız.
4. Kısa süreli Giriş Jetonu alma
Facebook sayfanıza otomatik olarak gönderme yapabilmeniz için süresiz giriş jetonu almanız gerekir. Süresiz giriş jetonunu almadan önce, kısa süreli giriş jetonu almak gerekir. Bunun için:
a. Facebook Graph API Explorer sayfasına gidin. Karşınıza gelen sayfada "Graph API Explorer" seçili bölüme tıklayarak, Facebook uygulamanızı seçin.
b. "Jeton Al" kutusuna tıklayınca açılan menüden "Get User Access Token" seçeneğini seçin.
c. Karşınıza gelen aşağıdaki pencereden 'publish_pages' ve 'manage_pages' seçeneklerini seçin ve 'Get Access Token' butonuna tıklayın.
d. Karşınıza gelen aşağıdaki pencerede '... olarak devam et' butonuna tıklayın.
e. Karşınıza gelen aşağıdaki pencerede 'Tamam' butonuna tıklayın.
f. Karşınıza gelen pencerede kırmızı çerçeve ile gösterilen ve yaklaşık bir saat içinde geçerliliği sona erecek olan bir "Kullanıcı Giriş Jetonu" elde edilmiş olur.
6. Sınırsız Giriş Jetonu oluşturma
Aşağıdaki url adresi içindeki uygulama kodu, uygulama gizli anahtarı ve giriş jetonu değeri yerine elde ettiğiniz değerleri girerek, tarayıcınızın adres çubuğuna değeri girin ve ENTER tuşuna basın:
https://graph.facebook.com/oauth/access_token?grant_type=fb_exchange_token&client_id=uygulamaid&client_secret=uygulamagizlianahtari&fb_exchange_token=girisjetonu
İşlemi uyguladıktan sonra, aşağıdakine benzer bir ekran karşınıza gelecektir:
access_token=EAAFUAnVleooBAMlPgbjwNUIgOtZCpIuBrn5jxISrOyZA3BtrtGywBAEY7mNO11z4orGDlNuxtaW3Y0naVzZC1RGRhCAQb6oSaXWTqMQKvWbdBoIH77LshklGxHaNPT5teVt6LXS8ZBjMxAr89y73jIaNpZCexuy0ZD&expires=5184000
Böylece, zaman sınırsız kullanım özelliğine sahip ve aşağıdakine benzer bir giriş jetonu elde etmiş oluruz:
EAAFUAnVleooBAMlPgbjwNUIgOtZCpIuBrn5jxISrOyZA3BtrtGywBAEY7mNO11z4orGDlNuxtaW3Y0naVzZC1RGRhCAQb6oSaXWTqMQKvWbdBoIH77LshklGxHaNPT5teVt6LXS8ZBjMxAr89y73jIaNpZCexuy0ZD
Elde edilen giriş jetonunun bilgilerini elde etmek için Erişim Jetonu Hata Ayıklayıcısı nı kullanabilirsiniz.
Karşınıza gelen pencerede, aşağıda kırmızı çerçeve ile belirlenmiş alana elde ettiğiniz Giriş Jetonunu girer ve "Hata Ayıklama" butonuna tıklarsanız, giriş jeton ile ilgili bilgilere ulaşabilirsiniz. Kırmızı ile işaretlenmiş Asla ifadesine dikkat ediniz.
7. PHP kodlarını oluşturma
a. Web sitemize yeni eklenen makaleleri Facebook sayfamıza otomatik olarak göndermek için, Facebook Graph API komutlarını kullanacağız. Facebook Graph API komutlarını kullanmadan önce, oluşturduğunuz Facebook uygulamanızın bilgilerini Facebook\Facebook hizmeti ile kullanabilmek için konfigürasyon değerlerinizi içeren bir Facebook\Facebook değişkeni oluşturmanız gerekir. Aşağıdaki komut içinde, app-id ile gösterilen yere Uygulama Kodunuzu (Application ID), app-secret ile gösterilen yere ise Uygulama Gizli Anahtarı Kodunuzu girerek bu işlemi gerçekleştirebilirsiniz.
$fb = new Facebook\Facebook([ 'app_id' => 'app-id', 'app_secret' => 'app-secret', 'default_graph_version' => 'v2.8', ]);
$fb = new Facebook\Facebook([ 'app_id' => '373844512963210', 'app_secret' => '87cc74a234beb6ab0c79e272d90e04ea', 'default_graph_version' => 'v2.8', ]);
b. Elde ettiğimiz süresiz kullanıcı giriş jetonunu aktif hale getirme ve kullanıcı hakkında temel bilgileri almak için aşağıdaki kod satırlarını ekleyin.
$accessToken = 'girişjetondegeri'; // Kullanıcı giriş jetonunu aktif jeton haline getirme $fb->setDefaultAccessToken($accessToken); // Kullanıcı hakkında temel bilgileri alma try { $profile_request = $fb->get('/me'); $profile = $profile_request->getGraphNode()->asArray(); } catch(Facebook\Exceptions\FacebookResponseException $e) { echo 'Grafik hatası: ' . $e->getMessage(); header("Yer: ./"); exit; } catch(Facebook\Exceptions\FacebookSDKException $e) { echo 'Facebook SDK hatası: ' . $e->getMessage(); exit; }
Yukarıdaki satırlarda, Facebook Graph API'ye /me uç noktası için bir GET işlemi talebi gönderiyoruz. /me uç noktası kullanıcıya ulaşmada veya sayfa oluşturma isteklerinde kullanılır.
c. Aşağıdaki kod satırları, Facebook hesabında bulunan sayfa bilgilerini alır ve sırasıyla sayfa isimlerini kontrol ederek, gönderiyi iletmek istediğiniz sayfa adı ile karşılaştığında, post komutunu kullanarak gönderme işlemini gerçekleştirir.
// Facebook hesabında bulunan sayfa bilgilerini alma $pages = $fb->get('/me/accounts'); $pages = $pages->getGraphEdge()->asArray(); foreach ($pages as $key) { if ($key['name'] == 'Sayfa_Adı') { $params["message"] = 'Başlık bilgisi'; $params["name"] = 'Gönderenin adı'; $params["link"] = 'Gönderinin linki'; $params["picture"] = "Resim internet adresi"; $params["description"] = 'Gönderi ana metin kısmı'; A description of a link in the post (appears beneath the caption). // Gönderme işlemi $post = $fb->post('/' . $key['id'] . '/feed', $params, $key['access_token']); } }
post komutu ile ilgili parametrelere Facebook Geliştiricileri adresinden ulaşabilirsiniz.
Yukarıda parça parça bulunan kodları birleştirdiğinizde aşağıdaki gibi bir dosya elde edebilirsiniz:
require_once __DIR__ . '/fbsrc/Facebook/autoload.php'; $fb = new Facebook\Facebook([ 'app_id' => '373844512963210', 'app_secret' => '87cc74a234beb6ab0c79e272d90e04ea', 'default_graph_version' => 'v2.8', ]); $accessToken = 'girişjetondegeri'; // Kullanıcı giriş jetonunu aktif jeton haline getirme $fb->setDefaultAccessToken($accessToken); // Kullanıcı hakkında temel bilgileri alma try { $profile_request = $fb->get('/me'); $profile = $profile_request->getGraphNode()->asArray(); } catch(Facebook\Exceptions\FacebookResponseException $e) { echo 'Grafik hatası: ' . $e->getMessage(); header("Yer: ./"); exit; } catch(Facebook\Exceptions\FacebookSDKException $e) { echo 'Facebook SDK hatası: ' . $e->getMessage(); exit; } // Facebook hesabında bulunan sayfa bilgilerini alma $pages = $fb->get('/me/accounts'); $pages = $pages->getGraphEdge()->asArray(); foreach ($pages as $key) { if ($key['name'] == 'Sayfa_Adı') { $params["message"] = 'Başlık bilgisi'; $params["name"] = 'Gönderenin adı'; $params["link"] = 'Gönderinin linki'; $params["picture"] = "Resim internet adresi"; $params["description"] = 'Başlık altındaki açıklama kısmı'; // Gönderme işlemi $post = $fb->post('/' . $key['id'] . '/feed', $params, $key['access_token']); } }
Yukarıdaki PHP kodlarını bu haliyle (kırmızı ile işaretli bilgileri kendi bilgilerinizle değiştirerek), lokal sunucunuzda Facebook dizininizin yer aldığı ana dizinde (C:\\wamp\www\\benimsitem\) bulunan bir dosyaya kaydederek, tarayıcınızın satırında çalıştırdığınızda, Sayfa_Adı ile gösterilen Facebook sayfanıza ileti gönderilmiş olur.
Jquery
14.05.2014
Yazar: Admin
Kullanıcıların input alanlarında yapacağı değişikliklerde herhangi bir nedenle önceki mevcut değerini kontrol etme ihtiyacı duyduğunuzda, focus ve blur fonksiyonlarını birlikte kullanabilirsiniz.
Aynı işlem için change fonksiyonunu kullandığınızda önceki değer değiştirilmiş olduğundan erişim sağlanamaz. Sadece ön tanımlı değer varsa, bu değer kullanılabilir.
Aşağıdaki örnekte, sayi1 input alanında, kullanıcı herhangi bir değer girmediğinde; uyarı yazısı ekrana gelir ve alanda yer alan bir önceki değer alana yazılır. sayi2 input alanında ise; kullanıcı herhangi bir değer girmediğinde; uyarı yazısı ekrana gelir ve alan için ön tanımlı olan 21 değeri ekrana yazılır.
<html>
<head>
<script type="text/javascript">
$(document).ready(function() {
$('#sayi1').on("focus", function() {
$(this).data("previous-value", $(this).val());
});
$('#sayi1').on("blur", function() {
if ($(this).val() == '') {
alert('Bir değer girmelisiniz');
$(this).val($(this).data("previous-value"));
}
});
$('#sayi2').on("change", function() {
if ($(this).val() == '') {
alert('Bir değer girmelisiniz');
$(this).val($(this).prop("defaultValue"));
}
});
});
</script>
</head>
<body>
<input id='sayi1' name='sayi1' type='text' value='' size='3' maxlength='3'>
<input id='sayi2' name='sayi2' type='text' value='21' size='3' maxlength='3'>
</body>
</html>