PDA

View Full Version : سوال: چرا HotKey در برنامم فقط یک بار کار می کنه؟



mbshareat
جمعه 16 اردیبهشت 1390, 03:15 صبح
با سلام و خدا قوت
من یه برنامه دارم که باهاش ناحیه ای از صفحه رو انتخاب کرده و به صورت فایل بیت مپ ذخیره می کنم.
(مثل وقتی که OneNote تو حافظه باشه و دکمه Win+S v رو فشار بدیم:لبخند:)
برای گرفتن تصویر Ctrl+Q رو تعریف کردم اما نمی دونم چرا برنامم فقط بار اول با فشار این ترکیب کلید فعال میشه.
لطف کنین یه نگاه به برنامم بندازین::متفکر:

tdkhakpur
جمعه 16 اردیبهشت 1390, 12:16 عصر
برنامه رو خیلی پیچیده کردید اما اگر کدها رو بصورت زیر اصلاح کنید همانی میشود که میخواهید.


Procedure TForm1.WMHotkey( Var msg:TWMHotkey);
Begin
If msg.hotkey = 1 Then
Begin
Form1.Visible := false;
CopyScreenRect.Click;
Form1.Visible := true;
End;
end;
//-------------------------
procedure TForm1.CopyScreenRectClick(Sender: TObject);
var
MyFormat : Word;
B:TBitmap;
AData:Cardinal;
APalette : HPalette;
begin
B:=Tbitmap.Create;
sleep(250);
ScreenShot(B);
B.SaveToFile('C:\Desktop.bmp');
B.Free;
end;

mbshareat
جمعه 16 اردیبهشت 1390, 17:42 عصر
با سلام:قلب:
من نمی تونم برنامه رو ساده کنم.روند برنامکه به این صورته که برنامه باید به نوار وظیفه بره تا تمام دسکتاپ نمایان بشه بعد پنجره رو تمام صفحه می کنم و تصویر دسکتاپ رو توی Image می ریزم و بعد از Image ناحیه ای رو ذخیره می کنم.این ناحیه رو هم با یه Shape مستطیل قرمز نمایش می دم که با کلیک و حرکت ماوس قابل تنظیم است.
من هنوز نفهمیدم مشکل از کجاست برنامم هم نمیتونه به شکلی که شما فرمودین اصلاح بشه و همون کار رو بکنه.
لطفا بفرمایین چطور کدم رو اصلاح کنم که هم بتونم همه تصویر دسکتاپ رو بدون پنجره برنامه تو برنامم داشته باشم و بتونم یه ناحیه از اون رو در فایل ذخیره کنم؟
آیا انتقال برنامه به نوار وظیفه موجب می شه Close اجرا بشه و HotKey غیر فعال بشه؟

tdkhakpur
جمعه 16 اردیبهشت 1390, 18:51 عصر
آیا انتقال برنامه به نوار وظیفه موجب می شه Close اجرا بشه و HotKey غیر فعال بشه؟
نه ربطی به بسته شدن نداره فقط جلوی این پیغام گرفته میشه.
میتونید کد تعریف مجد hotkey رو به آخر Image1MouseUp اضافه کنید این میتونه مشکل رو حل کنه اما پاسخی برای سوال شما نیست و باید بررسی بشه چرا این پیغام برای فرم بعد از اجرای CopyScreenRectClick ارسال نشده و اجرا نمیشه.

بفرمایین چطور کدم رو اصلاح کنم که هم بتونم همه تصویر دسکتاپ رو بدون پنجره برنامه تو برنامم داشته باشم و بتونم یه ناحیه از اون رو در فایل ذخیره کنم؟

کد اصلاحی



procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
CopyScreenRect.Visible:=True;
SendToClipBoard.Visible:=True;
Edit1.Visible:=True;
mouseIsDown:=False;
P2.X:=X;
P2.Y:=Y;
Pic.Width:=P2.X-P1.X+1;
Pic.Height:=P2.Y-P1.Y+1;
Pic.Canvas.CopyRect(rect(0,0,Pic.Width,Pic.Height) , Image1.Picture.Bitmap.Canvas,Rect(P1.X,P1.Y,P2.X,P 2.Y));
Pic.SaveToFile('C:\'+Edit1.text+'.bmp');
Edit1.text:=IntTostr(StrToInt(Edit1.text)+1);
Borderstyle:=bsSingle;
Width:=300;
Height:=100;
shape1.Left:=2000;
// application.Minimize;
RegisterHotKey(Handle,1,MOD_CONTROL,ord('Q')); // why we must rerun this line
end;