PDA

View Full Version : سوال: ارسال Ctrl+C به برنامه دیگر



mbshareat
دوشنبه 27 فروردین 1403, 09:48 صبح
سلام بر دوستان عزیز
من در برنامه نیاز دارم تصویری از فایل PDF بگیرم و ذخیره کنم.بعضی برنامه ها هستند که وقتی یک ناحیه رو انتخاب می کنیم خودکار تصویر رو به کلیپ برد می فرستند. اما الان در کامپیوتر ادوب آکروبات پرو دارم که چیزی در کلیپ برد نمیذاره. مجبوره یا کلیک روی منو رو شبیه سازی کنم یا Ctrl+C. کد SendMessage , keybd_event v رو امتحان کردم ولی بیفایده بود. من یک HotKey برای شیفت و W تعریف کردم که وقتی در برنامه اجراگر PDF (مثل فاکسیت ریدر) هستیم به برنامه خودم منتقل بشه و تصویر کلیپ برد رو با نام خاص ذخیره کند. اما وقتی به برنامه برمیگرده یه پیغام میاد که کلیپ برد فرمت تصویر نداره.لطفا راهنمایی کنید. یادمه قبلا هم شبیه سازی کلید دردساز و خیلی مواقع بیفایده بوده.من این کدها رو امتحان کردم:
keybd_event(VK_LCONTROL, 0, 0, 0);
keybd_event(Ord('C'), 0, 0, 0);
keybd_event(Ord('C'), 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_LCONTROL, 0, KEYEVENTF_KEYUP, 0);}
H:=GetForeGroundWindow();
PostMessage(H, WM_KEYDOWN, VK_CONTROL, 0);
PostMessage(H, WM_KEYDOWN, Ord('C'),0);
PostMessage(H, WM_KEYUP, Ord('C'), 0);
PostMessage(H, WM_KEYUP, VK_CONTROL,0);
Application.ProcessMessages;

با این توضیح که برنامه پنجره جاری رو بررسی می کنه و GetForeGroundWindow برنامه ادوب آکروبات رو درست تشخیص میده.:بامزه:

دلفــي
پنج شنبه 06 اردیبهشت 1403, 10:40 صبح
سلام بر دوستان عزیز
من در برنامه نیاز دارم تصویری از فایل PDF بگیرم و ذخیره کنم.بعضی برنامه ها هستند که وقتی یک ناحیه رو انتخاب می کنیم خودکار تصویر رو به کلیپ برد می فرستند. اما الان در کامپیوتر ادوب آکروبات پرو دارم که چیزی در کلیپ برد نمیذاره. مجبوره یا کلیک روی منو رو شبیه سازی کنم یا Ctrl+C. کد SendMessage , keybd_event v رو امتحان کردم ولی بیفایده بود. من یک HotKey برای شیفت و W تعریف کردم که وقتی در برنامه اجراگر PDF (مثل فاکسیت ریدر) هستیم به برنامه خودم منتقل بشه و تصویر کلیپ برد رو با نام خاص ذخیره کند. اما وقتی به برنامه برمیگرده یه پیغام میاد که کلیپ برد فرمت تصویر نداره.لطفا راهنمایی کنید. یادمه قبلا هم شبیه سازی کلید دردساز و خیلی مواقع بیفایده بوده.من این کدها رو امتحان کردم:
keybd_event(VK_LCONTROL, 0, 0, 0);
keybd_event(Ord('C'), 0, 0, 0);
keybd_event(Ord('C'), 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_LCONTROL, 0, KEYEVENTF_KEYUP, 0);}
H:=GetForeGroundWindow();
PostMessage(H, WM_KEYDOWN, VK_CONTROL, 0);
PostMessage(H, WM_KEYDOWN, Ord('C'),0);
PostMessage(H, WM_KEYUP, Ord('C'), 0);
PostMessage(H, WM_KEYUP, VK_CONTROL,0);
Application.ProcessMessages;

با این توضیح که برنامه پنجره جاری رو بررسی می کنه و GetForeGroundWindow برنامه ادوب آکروبات رو درست تشخیص میده.:بامزه:

از این کد کمک بگیر

procedure TForm1.Button1Click(Sender: TObject);
const
FullWindow = True;
var
Win: HWND;
DC: HDC;
Bmp: TBitmap;
WinRect: TRect;
Width: Integer;
Height: Integer;
begin
Form1.Hide;
try
Application.ProcessMessages;
Win := GetForegroundWindow;


if FullWindow then
begin
GetWindowRect(Win, WinRect);
DC := GetDC(Win);
end else
begin
Winapi.Windows.GetClientRect(Win, WinRect);
DC := GetDC(Win);
end;
try
Width := WinRect.Right - WinRect.Left;
Height := WinRect.Bottom - WinRect.Top;


Bmp := TBitmap.Create;
try
Bmp.Height := Height;
Bmp.Width := Width;
BitBlt(Bmp.Canvas.Handle, 0, 0, Width, Height, DC, 0, 0, SRCCOPY);
Bmp.SaveToFile('C:\Screenshot.bmp');
finally
Bmp.Free;
end;
finally
ReleaseDC(Win, DC);
end;
finally
Form1.Show;
end;
end;

mbshareat
دوشنبه 01 مرداد 1403, 10:59 صبح
سلام
ممنونم.کد خوبیه ولی من در برنامه اجراگر PDF با ماوس محدوده تعیین کرده ام.خوشبختانه هنوز برنامه دیگری هست که نیاز به Ctrl+C نداره