View Full Version : سوال: معماری پیغام ها در ویندوز؟
A_Salimi
جمعه 18 اردیبهشت 1388, 00:17 صبح
سلام
سوالی که برای من بوجود آمده این است که معماری پیغام ها در ویندوز بر چه مبنایی است و آیا ما هم میتوانیم پیغام هایی بنویسیم که دیگران از آن استفاده کنند؟
خیلی وقت ها به یک پیغام خاص نیاز دارم که معمولا به روشی این پیغام را دریافت میکنم که به نظر خودم غیر متعارف است .برای مثال :برای اینکه بتوانم پیغام قرار گرفتن یک CD در درایو را دریافت کنم به این صورت عمل کردم :در یک تایمر مدام درایو های CDROM را بدست می آوردم و هر وقت که lable هر کدام تغییر می کرد متوجه میشدم که یک CD در درایو قرار داده شده است (که مسلما راه جالبی نیست).تا اینجا کاری که من انجام میدادم این بود که من مدام از آن تغییر خبر میگرفتم سوال من این است که چطور می توان کاری کرد که به محض ایجاد هر تغییر ویندوز به ما خبر دهد .من شنیده ام که در دات نت میتوانیم مستقیما Event بنویسیم ، با این وجود آیا در vc و پروژه های native هم چنین امکانی وجود دارد ؟
A_Salimi
شنبه 19 اردیبهشت 1388, 16:33 عصر
من در جستجویی که اخیرا انجام دادم (برای گرفتن پیغام قرار گرفتن سی دی در درایو ) به نتیجه و کد زیر رسیدم
When the user inserts a new CD or DVD into a drive, applications receive a WM_DEVICECHANGE message with a DBT_DEVICEARRIVAL event. The application must check the event to ensure that the type of device arriving is a volume (the dbch_devicetype member is DBT_DEVTYP_VOLUME) and that the change affects the media (the dbcv_flags member is DBTF_MEDIA).
When the user removes a CD or DVD from a drive, applications receive a WM_DEVICECHANGE message with a DBT_DEVICEREMOVECOMPLETE event. Again, the application must check the event to ensure that the device being removed is a volume and that the change affects the media.
و کد زیر :
check for insertion or removal of a CD or DVD.
#include <windows.h>
#include <dbt.h>
void Main_OnDeviceChange (HWND hwnd, WPARAM wParam, LPARAM lParam);
char FirstDriveFromMask (ULONG unitmask); //prototype
/*------------------------
------------------------------------------
Main_OnDeviceChange (hwnd, wParam, lParam)
Description
Handles WM_DEVICECHANGE messages sent to the application's
top-level window.
--------------------------------------------------------------------*/
void Main_OnDeviceChange (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
char szMsg[80];
switch(wParam)
{
case DBT_DEVICEARRIVAL:
// Check whether a CD or DVD was inserted into a drive.
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if (lpdbv -> dbcv_flags & DBTF_MEDIA)
{
wsprintf (szMsg, "Drive %c: Media has arrived.\n",
FirstDriveFromMask(lpdbv ->dbcv_unitmask));
MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
}
}
break;
case DBT_DEVICEREMOVECOMPLETE:
// Check whether a CD or DVD was removed from a drive.
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if (lpdbv -> dbcv_flags & DBTF_MEDIA)
{
wsprintf (szMsg, "Drive %c: Media was removed.\n",
FirstDriveFromMask(lpdbv ->dbcv_unitmask));
MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
}
}
break;
default:
/*
Process other WM_DEVICECHANGE notifications for other
devices or reasons.
*/
;
}
}
/*------------------------------------------------------------------
FirstDriveFromMask (unitmask)
Description
Finds the first valid drive letter from a mask of drive letters.
The mask must be in the format bit 0 = A, bit 1 = B, bit 3 = C,
etc. A valid drive letter is defined when the corresponding bit
is set to 1.
Returns the first drive letter that was found.
--------------------------------------------------------------------*/
char FirstDriveFromMask (ULONG unitmask)
{
char i;
for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> 1;
}
return (i + 'A');
}
ممکنه از دوستان با تجربه کمی در مورد این کدها به ما یاری برسانند؟
من با قرار دادن این کدها هیچ پیغامی دریافت نکردم:ناراحت:
hoax3r
شنبه 19 اردیبهشت 1388, 19:46 عصر
سلام
باید در procedure پنجرت که پیامها رو برسی مکینید پیام WM_DEVICECHANGE رو هم برسی کنید
این مثال رو ببین:
INT_PTR CALLBACK DialogProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DEVICECHANGE:
Main_OnDeviceChange(hwnd, wParam, lParam);
break;
case WM_CLOSE:
EndDialog(hwnd, 0);
break;
}
return 0;
}
A_Salimi
شنبه 19 اردیبهشت 1388, 23:31 عصر
واقعا متشکرم.اگر مشکلی بود مزاحمتان میشوم.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.