View Full Version : گرفتن تصویر از کلیک راست ماوس در فایل اجرایی
mahdy.asia
جمعه 13 مرداد 1391, 07:07 صبح
من یک برنامه با دلفی نوشتم می خوام برای درست کردن کاتولوگ نرم افزار از کلیک راست ماوس وقتی برنامه در جال اجرا است تصویر بگیرم.
با هر نرم افزاری این کار رو انجام دادم از صفحه عکس می گیره اما کلیک راست ماوس رو نمایش نمی ده
Felony
جمعه 13 مرداد 1391, 08:49 صبح
تصویر گرفتن از کلیک راست موس یعنی PopupMenu نمایش داده شده زمانی که کلیک راست انجام میشه ؟
اگر بله ، به صورت عادی نباید مشکلی داشته باشه ، کار خاصی روش انجام ندادید ؟
Ananas
جمعه 13 مرداد 1391, 13:17 عصر
فکر کنم منظورش مکان نمای موس هست. تو حالت عادی مکان نما رو نمیشه printscreen گرفت باید جدا گانه اون رو روی تصویر مورد نظر کشید. با استفاده از یک TIcon و تابع GetCursorInfo. نمونه ای که نوشتم تو یک تایمر دائما تصویر Desktop رو روی فرم نمایش میده که با نزدیک کردن فرم به طرف بالا و سمت چپ مانیتور، تصویر حالت جالبی پیدا میکنه مثل اینکه دوتا آیینه رو بزاری روبروی هم.
procedure TForm1.Timer1Timer(Sender: TObject);
var
dc : HDC;
ci : tagCURSORINFO;
ic : TIcon;
begin
(Sender as TTimer).Interval := 1;
dc := GetDC(GetDesktopWindow);
BitBlt(Self.Canvas.Handle, 0, 0, Self.ClientWidth, Self.ClientHeight, dc, 0, 0, SRCCOPY);
ci.cbSize := SizeOf(ci);
GetCursorInfo(ci);
ic := TIcon.Create;
ic.Handle := ci.hCursor;
Self.Canvas.Draw( ci.ptScreenPos.X, ci.ptScreenPos.Y, ic);
ic.Free;
ReleaseDC(GetDesktopWindow, dc);
end;
Ananas
جمعه 13 مرداد 1391, 13:48 عصر
این یکی بهتره بدون TIcon و همچنین با مکان دقیق Cursor. قبلی جاش درست نیست بعضی وقتا یه نصفه میره سمت راست و پایین.
procedure TForm1.Timer1Timer(Sender: TObject);
var
dc : HDC;
ci : tagCURSORINFO;
icif : ICONINFO;
begin
(Sender as TTimer).Interval := 1;
// --------------------------
dc := GetDC(GetDesktopWindow);
BitBlt(Self.Canvas.Handle, 0, 0, Self.ClientWidth, Self.ClientHeight, dc, 0, 0, SRCCOPY);
ReleaseDC(GetDesktopWindow, dc);
// --------------------------
ci.cbSize := SizeOf(ci);
GetCursorInfo(ci);
GetIconInfo(ci.hCursor, icif);
DrawIcon(
Self.Canvas.Handle,
ci.ptScreenPos.X - icif.xHotspot,
ci.ptScreenPos.Y - icif.yHotspot,
ci.hCursor);
// --------------------------
end;
Felony
جمعه 13 مرداد 1391, 16:04 عصر
فکر کنم منظورش مکان نمای موس هست.
من یک برنامه با دلفی نوشتم می خوام برای درست کردن کاتولوگ نرم افزار از کلیک راست ماوس وقتی برنامه در جال اجرا است تصویر بگیرم.
با هر نرم افزاری این کار رو انجام دادم از صفحه عکس می گیره اما کلیک راست ماوس رو نمایش نمی د
والا سوالی که ایشون پرسیدن نه هیچ ربطی به Popup Menu که من گفتم داره و نه هیچ ربطی به Cursor موس ... !
اینطور سوال پرسیدن تو این سایت داره رسم میشه ؛ فکر میکنم چند وقت دیگه سوالات به صورت زیر در میاد و دوستان برنامه نویس برای پاسخ دادن به سوالات باید به مباحث پیس گویی و کتاب های نوستراداموس هم مسلط باشن :
- آقا من یک مشکلی تو دلفی دارم ، چی کار کنم حل بشه ؟!
me.enik
جمعه 13 مرداد 1391, 17:13 عصر
ما هم یه پیشگویی میکنیم ... !
منظور ایشون این بودش که چی جوری, از کلیک راستی که مثلا در ویندوز میکنند, عکس بگیرند.
چون هدفشان درست کردن یک فایل آموزشی هستش و انتشار آن, به خاطر همین, به یک برنامه ای, یا چیزی احتیاج دارند که بتوانند از کلیک راست عکس بگیرند.
والا من که با print screen اینکار رو کردم, کلیک راست رو نشون میده, فقط مکان مواس رو نشون نمیده که چندان چیز مهمی نیستش.
اما اگر حتما میخواید مکان نما نمایش داده بشود, من تونستم با ashampoo magical snap 5 از کروسور عکس بگیرم ... !
مدرک :
90685
Ananas
جمعه 13 مرداد 1391, 19:18 عصر
والا من که با print screen اینکار رو کردم, کلیک راست رو نشون میده, فقط مکان مواس رو نشون نمیده که چندان چیز مهمی نیستش.
ای بابا!
من که کد راحتالحلقومشو نوشتم.
mbshareat
جمعه 13 مرداد 1391, 23:47 عصر
سلام
آقای قدیانی کد مختصر و مفیدی گذاشتین. ظاهرا چون تصویر رو وی فرم کپی میکنه تصویر تو در تو و آبشاری میشه.
این کد هم بد نیست:
// 1. Get the handle to the current mouse-cursor and its position
function GetCursorInfo2: TCursorInfo;
var
hWindow: HWND;
pt: TPoint;
pIconInfo: TIconInfo;
dwThreadID, dwCurrentThreadID: DWORD;
begin
Result.hCursor := 0;
ZeroMemory(@Result, SizeOf(Result));
// Find out which window owns the cursor
if GetCursorPos(pt) then
begin
Result.ptScreenPos := pt;
hWindow := WindowFromPoint(pt);
if IsWindow(hWindow) then
begin
// Get the thread ID for the cursor owner.
dwThreadID := GetWindowThreadProcessId(hWindow, nil);
// Get the thread ID for the current thread
dwCurrentThreadID := GetCurrentThreadId;
// If the cursor owner is not us then we must attach to
// the other thread in so that we can use GetCursor() to
// return the correct hCursor
if (dwCurrentThreadID <> dwThreadID) then
begin
if AttachThreadInput(dwCurrentThreadID, dwThreadID, True) then
begin
// Get the handle to the cursor
Result.hCursor := GetCursor;
AttachThreadInput(dwCurrentThreadID, dwThreadID, False);
end;
end
else
begin
Result.hCursor := GetCursor;
end;
end;
end;
end;
// 2. Capture the screen
function CaptureScreen: TBitmap;
var
DC: HDC;
ABitmap: TBitmap;
MyCursor: TIcon;
CursorInfo: TCursorInfo;
IconInfo: TIconInfo;
begin
// Capture the Desktop screen
DC := GetDC(GetDesktopWindow);
ABitmap := TBitmap.Create;
try
ABitmap.Width := GetDeviceCaps(DC, HORZRES);
ABitmap.Height := GetDeviceCaps(DC, VERTRES);
// BitBlt on our bitmap
BitBlt(ABitmap.Canvas.Handle,
0,
0,
ABitmap.Width,
ABitmap.Height,
DC,
0,
0,
SRCCOPY);
// Create temp. Icon
MyCursor := TIcon.Create;
try
// Retrieve Cursor info
CursorInfo := GetCursorInfo2;
if CursorInfo.hCursor <> 0 then
begin
MyCursor.Handle := CursorInfo.hCursor;
// Get Hotspot information
GetIconInfo(CursorInfo.hCursor, IconInfo);
// Draw the Cursor on our bitmap
ABitmap.Canvas.Draw(CursorInfo.ptScreenPos.X - IconInfo.xHotspot,
CursorInfo.ptScreenPos.Y - IconInfo.yHotspot, MyCursor);
end;
finally
// Clean up
MyCursor.ReleaseHandle;
MyCursor.Free;
end;
finally
ReleaseDC(GetDesktopWindow, DC);
end;
Result := ABitmap;
end;
// Example: Capture the screen and include the cursor.
// Show the Screenshot in Image1
procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Picture.Assign(CaptureScreen);
end;
MohsenB
شنبه 14 مرداد 1391, 00:20 صبح
سلام
فکر کنم بد نباشه از چرخهای قبلی اختراع شده مثل SnagIt (http://www.techsmith.com/snagit.html)استفاده کنید .
موفق باشيد
Ananas
شنبه 14 مرداد 1391, 00:32 صبح
ممنون.
امتحانش کردم یه مشکلی وجود داره تو قسمت :begin
Image1.Picture.Assign(CaptureScreen);
end;
من این قسمت رو گذاشتم داخل تایمر دیدم تو task manager همینجوری داره رم پر میشه بعد کد زیر رو امتحان کردم درست شد.
var
b : TBitmap;
begin
b := CaptureScreen;
Image1.Picture.Assign(b);
b.Free;
end;
mahdy.asia
شنبه 14 مرداد 1391, 16:13 عصر
از همه دوستان ممنونم فکر نمی کردم این همه پاسخ گذاشته بشه آخه بعضی از تاپیک های من بدون پاسخ می مونه متشکرم متشکرم متشکرم
منظور ایشون این بودش که چی جوری, از کلیک راستی که مثلا در ویندوز میکنند, عکس بگیرند.
چون هدفشان درست کردن یک فایل آموزشی هستش و انتشار آن, به خاطر همین, به یک برنامه ای, یا چیزی احتیاج دارند که بتوانند از کلیک راست عکس بگیرند.
دوستان من نمی دونم چرا کلید پرینت اسکرین روی صفحه کلیدم کار نمی کنه (کلید خرابه یا ویندوزم خرابه و یا ...) با نرم افزار smartcapture هم نتونستم از کلیک راست ماوس عکس بگیرم آنلاین بودم گفتم توی سایت مطرح کنم هنوز هم به جواب نرسیدم
me.enik
شنبه 14 مرداد 1391, 16:36 عصر
سلام.
من با ashampoo magical snap کار کردم, میتونه بگیره.
اون عکسی رو هم که توی پست قبلی ضمیمه کردم, سندی هست بر این حرفم.
mbshareat
شنبه 14 مرداد 1391, 19:13 عصر
اگه به کدها توجه می کردین ملاحظه می کردید که بدون فشار Print Screen هم میشه تصویر گرفت.می تونین از ترکیب دو کلید به جای این کلید استفاده کنین (با HotKey)
از WindowFromPoint میشه برای بدست آوردن هندل پنجره استفاده کرد. اما من نه با بررسی کلیک راست ماوس نه HotKey نتونستم تا وقتی منوی کلیک راست تو صفحه هست ازش استفاده کنم. این کد رو نوشتم اگه بدردتون خورد بردارین(نتونستم امتحانش کنم!):
procedure CaptureForm(WinHandle:THandle;Var bmp: TBitmap);
var
DCWindow: HDC;
R:TRect;
begin
DCWindow := GetWindowDC(WinHandle);
GetWindowRect(WinHandle,R);
bmp.Height := R.Right-R.Left+1;
bmp.Width := R.Bottom-R.Top+1;
BitBlt(bmp.Canvas.Handle
, 0, 0,Bmp.Width,Bmp.Height
,DCWindow,R.Left,R.Top,SRCCOPY);
ReleaseDC(DCWindow, DCWindow);
end;
Procedure GetPopupMenuBmp(Var B:TBitmap);
Var
P:TPoint;
H:THandle;
begin
getcursorpos(P);
Inc(P.X,20);
Inc(P.Y,20);
H:=windowfrompoint(P);
CaptureForm(H,B);
End;
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.