summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/SendScreenshotPlus/res/resource.rc1
-rw-r--r--plugins/SendScreenshotPlus/src/UMainForm.cpp91
-rw-r--r--plugins/SendScreenshotPlus/src/UMainForm.h1
-rw-r--r--plugins/SendScreenshotPlus/src/Utils.cpp71
-rw-r--r--plugins/SendScreenshotPlus/src/Utils.h2
-rw-r--r--plugins/SendScreenshotPlus/src/resource.h1
6 files changed, 103 insertions, 64 deletions
diff --git a/plugins/SendScreenshotPlus/res/resource.rc b/plugins/SendScreenshotPlus/res/resource.rc
index d0264dcd6c..3e249e1a2f 100644
--- a/plugins/SendScreenshotPlus/res/resource.rc
+++ b/plugins/SendScreenshotPlus/res/resource.rc
@@ -110,6 +110,7 @@ BEGIN
RTEXT "Size (HxW):",ID_edtSizeLabel,0,30,50,8
EDITTEXT ID_edtSize,52,28,43,13,ES_CENTER | ES_AUTOHSCROLL | ES_READONLY
CONTROL "C&lient Area",ID_chkClientArea,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,100,30,62,8,WS_EX_RIGHT
+ CONTROL "indirect capture",ID_chkIndirectCapture,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,96,40,75,8,WS_EX_RIGHT
CTEXT "Target Tool",ID_lblDropInfo,162,1,51,8
ICON IDI_TARGET,ID_imgTarget,174,12,29,29,SS_NOTIFY | SS_CENTERIMAGE | SS_SUNKEN | WS_GROUP
END
diff --git a/plugins/SendScreenshotPlus/src/UMainForm.cpp b/plugins/SendScreenshotPlus/src/UMainForm.cpp
index 0a818fcc57..3d75ac336f 100644
--- a/plugins/SendScreenshotPlus/src/UMainForm.cpp
+++ b/plugins/SendScreenshotPlus/src/UMainForm.cpp
@@ -57,7 +57,7 @@ INT_PTR CALLBACK TfrmMain::DlgProc_CaptureTabPage(HWND hDlg, UINT uMsg, WPARAM w
Static_SetIcon(GetDlgItem(hDlg, ID_imgTarget), Skin_GetIcon(ICO_COMMON_SSWINDOW1));
break;
}
- break;
+ return TRUE;
case WM_CTLCOLORDLG:
case WM_CTLCOLOREDIT:
case WM_CTLCOLORSTATIC:
@@ -203,45 +203,46 @@ void TfrmMain::wmInitdialog(WPARAM wParam, LPARAM lParam) {
/// create the tab control.
{
- TAB_INFO itab={};
- RECT rcClient, rcTab;
m_hwndTab = GetDlgItem(m_hWnd, IDC_CAPTURETAB);
+ TabCtrl_SetImageList(m_hwndTab, m_himlTab);
TabCtrl_SetItemExtra(m_hwndTab, sizeof(TAB_INFO) - sizeof(TCITEMHEADER));
-
+ RECT rcTab;
+ TAB_INFO itab;
itab.hwndMain = m_hWnd;
itab.hwndTab = m_hwndTab;
-
- GetWindowRect(m_hwndTab, &rcTab);
- GetWindowRect(m_hWnd, &rcClient);
-
- TabCtrl_SetImageList(m_hwndTab, m_himlTab);
-
- /// Add a tab for each of the three child dialog boxes.
itab.tcih.mask = TCIF_PARAM|TCIF_TEXT|TCIF_IMAGE;
+ itab.tcih.iImage = 0;
+ /// Add a tab for each of the three child dialog boxes.
itab.tcih.pszText = TranslateT("Window");
// itab.tcih.iImage = 0;
- itab.hwndTabPage = CreateDialogParam(hInst,MAKEINTRESOURCE(IDD_UMain_CaptureWindow), m_hWnd,DlgProc_CaptureTabPage,IDD_UMain_CaptureWindow);
- TabCtrl_InsertItem(m_hwndTab, 0, &itab);
- MoveWindow(itab.hwndTabPage, (rcTab.left - rcClient.left)+2, (rcTab.top - rcClient.top), (rcTab.right - rcTab.left) - 2*5, (rcTab.bottom - rcTab.top) - 2*20, TRUE);
+ itab.hwndTabPage = CreateDialogParam(hInst,MAKEINTRESOURCE(IDD_UMain_CaptureWindow),m_hWnd,DlgProc_CaptureTabPage,IDD_UMain_CaptureWindow);
+ TabCtrl_InsertItem(m_hwndTab,0,&itab);
+ /// get tab boundaries (required after 1st tab)
+ GetClientRect(m_hwndTab,&rcTab);
+ MapWindowPoints(m_hwndTab,m_hWnd,(POINT*)&rcTab,2);
+ TabCtrl_AdjustRect(m_hwndTab,0,&rcTab);
+ rcTab.bottom-=rcTab.top; rcTab.right-=rcTab.left;
+ ///
+ SetWindowPos(itab.hwndTabPage,HWND_TOP,rcTab.left,rcTab.top,rcTab.right,rcTab.bottom,0);
+ CheckDlgButton(itab.hwndTabPage, ID_chkIndirectCapture, m_opt_chkIndirectCapture ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(itab.hwndTabPage, ID_chkClientArea, m_opt_chkClientArea ? BST_CHECKED : BST_UNCHECKED);
itab.tcih.pszText = TranslateT("Desktop");
// itab.tcih.iImage = 1;
- itab.hwndTabPage = CreateDialogParam(hInst,MAKEINTRESOURCE(IDD_UMain_CaptureDesktop), m_hWnd, DlgProc_CaptureTabPage,IDD_UMain_CaptureDesktop);
- TabCtrl_InsertItem(m_hwndTab, 1, &itab);
- MoveWindow(itab.hwndTabPage, (rcTab.left - rcClient.left)+2, (rcTab.top - rcClient.top), (rcTab.right - rcTab.left) - 2*5, (rcTab.bottom - rcTab.top) - 2*20, TRUE);
+ itab.hwndTabPage = CreateDialogParam(hInst,MAKEINTRESOURCE(IDD_UMain_CaptureDesktop),m_hWnd,DlgProc_CaptureTabPage,IDD_UMain_CaptureDesktop);
+ TabCtrl_InsertItem(m_hwndTab,1,&itab);
+ SetWindowPos(itab.hwndTabPage,HWND_TOP,rcTab.left,rcTab.top,rcTab.right,rcTab.bottom,0);
hCtrl = GetDlgItem(itab.hwndTabPage, ID_edtCaption);
ComboBox_ResetContent(hCtrl);
ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, TranslateT("<Entire Desktop>")) ,0);
ComboBox_SetCurSel (hCtrl,0);
if(m_MonitorCount >1) {
- TCHAR tszTemp[120];
- for (size_t mon=0; mon<m_MonitorCount; ++mon) { /// @todo : fix format for non MSVC compilers
+ TCHAR tszTemp[120];
+ for(size_t mon=0; mon<m_MonitorCount; ++mon) { /// @todo : fix format for non MSVC compilers
mir_sntprintf(tszTemp, SIZEOF(tszTemp),_T("%Iu. %s%s"),
- mon+1,
- TranslateT("Monitor"),
+ mon+1, TranslateT("Monitor"),
(m_Monitors[mon].dwFlags & MONITORINFOF_PRIMARY) ? TranslateT(" (primary)") : _T("")
);
ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, tszTemp) , mon+1);
@@ -252,9 +253,9 @@ void TfrmMain::wmInitdialog(WPARAM wParam, LPARAM lParam) {
itab.tcih.pszText = TranslateT("File");
// itab.tcih.iImage = 2;
- itab.hwndTabPage = CreateDialogParam(hInst,MAKEINTRESOURCE(IDD_UMain_CaptureFile), m_hWnd, DlgProc_CaptureTabPage,IDD_UMain_CaptureFile);
- TabCtrl_InsertItem(m_hwndTab, 2, &itab);
- MoveWindow(itab.hwndTabPage, (rcTab.left - rcClient.left)+2, (rcTab.top - rcClient.top), (rcTab.right - rcTab.left) - 2*5, (rcTab.bottom - rcTab.top) - 2*20, TRUE);
+ itab.hwndTabPage = CreateDialogParam(hInst,MAKEINTRESOURCE(IDD_UMain_CaptureFile),m_hWnd,DlgProc_CaptureTabPage,IDD_UMain_CaptureFile);
+ TabCtrl_InsertItem(m_hwndTab,2,&itab);
+ SetWindowPos(itab.hwndTabPage,HWND_TOP,rcTab.left,rcTab.top,rcTab.right,rcTab.bottom,0);
/// select tab and set m_hwndTabPage
TabCtrl_SetCurSel(m_hwndTab, m_opt_tabCapture);
@@ -385,6 +386,9 @@ void TfrmMain::wmCommand(WPARAM wParam, LPARAM lParam) {
m_opt_chkTimed = (BYTE)Button_GetCheck((HWND)lParam);
TfrmMain::chkTimedClick();
break;
+ case ID_chkIndirectCapture:
+ m_opt_chkIndirectCapture = (BYTE)Button_GetCheck((HWND)lParam);
+ break;
case ID_chkClientArea:
m_opt_chkClientArea = (BYTE)Button_GetCheck((HWND)lParam);
if(m_hTargetWindow)
@@ -392,7 +396,7 @@ void TfrmMain::wmCommand(WPARAM wParam, LPARAM lParam) {
break;
case ID_imgTarget:
if(m_opt_tabCapture!=0) break;
- m_hLastWin=0;
+ m_hLastWin=NULL;
SetTimer(m_hWnd,ID_imgTarget,BUTTON_POLLDELAY,NULL);
break;
case ID_btnAbout:
@@ -439,7 +443,7 @@ void TfrmMain::wmCommand(WPARAM wParam, LPARAM lParam) {
break;
case ID_edtCaption: //cboxDesktopChange
m_opt_cboxDesktop = (BYTE)ComboBox_GetItemData((HWND)lParam, ComboBox_GetCurSel((HWND)lParam));
- m_hTargetWindow = 0;
+ m_hTargetWindow = NULL;
if (m_opt_cboxDesktop > 0) {
edtSizeUpdate(m_Monitors[m_opt_cboxDesktop-1].rcMonitor, GetParent((HWND)lParam), ID_edtSize);
}
@@ -513,24 +517,29 @@ void TfrmMain::wmTimer(WPARAM wParam, LPARAM lParam){
KillTimer(m_hWnd,ID_imgTarget);
SystemParametersInfo(SPI_SETCURSORS,0,NULL,0);
DestroyWindow(m_hTargetHighlighter),m_hTargetHighlighter=NULL;
- SetTargetWindow(m_hTargetWindow);
+ SetTargetWindow(m_hLastWin);
Show();
return;
}
POINT point; GetCursorPos(&point);
- m_hTargetWindow=WindowFromPoint(point);
+ HWND hwnd=WindowFromPoint(point);
if(!((GetAsyncKeyState(VK_SHIFT)|GetAsyncKeyState(VK_MENU))&0x8000))
- for(HWND hTMP; (hTMP=GetParent(m_hTargetWindow)); m_hTargetWindow=hTMP);
- if(m_hTargetWindow!=m_hLastWin){
- m_hLastWin=m_hTargetWindow;
+ for(HWND hTMP; (hTMP=GetAncestor(hwnd,GA_PARENT)) && IsChild(hTMP,hwnd); hwnd=hTMP);
+ else{
+ ScreenToClient(hwnd,&point);
+ HWND hTMP; if((hTMP=RealChildWindowFromPoint(hwnd,point)))
+ hwnd=hTMP;
+ }
+ if(hwnd!=m_hLastWin){
+ m_hLastWin=hwnd;
RECT rect;
if(m_opt_chkClientArea){
- GetClientRect(m_hLastWin,&rect);
- ClientToScreen(m_hLastWin,(POINT*)&rect);
+ GetClientRect(hwnd,&rect);
+ ClientToScreen(hwnd,(POINT*)&rect);
rect.right=rect.left+rect.right;
rect.bottom=rect.top+rect.bottom;
}else
- GetWindowRect(m_hLastWin,&rect);
+ GetWindowRect(hwnd,&rect);
int width=rect.right-rect.left;
int height=rect.bottom-rect.top;
if(g_iTargetBorder){
@@ -559,7 +568,7 @@ void TfrmMain::wmTimer(WPARAM wParam, LPARAM lParam){
m_bCapture = true;
switch (m_opt_tabCapture) {
case 0:
- m_Screenshot = CaptureWindow(m_hTargetWindow, m_opt_chkClientArea);
+ m_Screenshot = CaptureWindow(m_hTargetWindow, m_opt_chkClientArea, m_opt_chkIndirectCapture);
break;
case 1:
m_Screenshot = CaptureMonitor((m_opt_cboxDesktop > 0) ? m_Monitors[m_opt_cboxDesktop-1].szDevice : NULL);
@@ -648,7 +657,6 @@ void TfrmMain::UMevent(WPARAM wParam, LPARAM lParam) {
FIP->FI_Unload(m_Screenshot);
m_Screenshot = NULL;
}
- /* m_hTargetWindow = */m_hLastWin = NULL;
Show();
}else{
// Saving Options and close
@@ -712,6 +720,7 @@ void TfrmMain::LoadOptions(void) {
m_opt_edtQuality = db_get_b(NULL, SZ_SENDSS, "JpegQuality", 75);
m_opt_tabCapture = db_get_b(NULL, SZ_SENDSS, "Capture", 0);
+ m_opt_chkIndirectCapture = db_get_b(NULL, SZ_SENDSS, "IndirectCapture", 0);
m_opt_chkClientArea = db_get_b(NULL, SZ_SENDSS, "ClientArea", 0);
m_opt_cboxDesktop = db_get_b(NULL, SZ_SENDSS, "Desktop", 0);
@@ -735,6 +744,7 @@ void TfrmMain::SaveOptions(void) {
db_set_b(NULL, SZ_SENDSS, "JpegQuality", m_opt_edtQuality);
db_set_b(NULL, SZ_SENDSS, "Capture", m_opt_tabCapture);
+ db_set_b(NULL, SZ_SENDSS, "IndirectCapture", m_opt_chkIndirectCapture);
db_set_b(NULL, SZ_SENDSS, "ClientArea", m_opt_chkClientArea);
db_set_b(NULL, SZ_SENDSS, "Desktop", m_opt_cboxDesktop);
@@ -795,7 +805,7 @@ void TfrmMain::btnCaptureClick() {
return;
}
if(m_opt_tabCapture!=2){
- m_Screenshot = CaptureWindow(m_hTargetWindow, m_opt_chkClientArea);
+ m_Screenshot = CaptureWindow(m_hTargetWindow, m_opt_chkClientArea, m_opt_chkIndirectCapture);
}
SendMessage(m_hWnd,UM_EVENT, 0, (LPARAM)EVT_CaptureDone);
}
@@ -1115,12 +1125,15 @@ void TfrmMain::FormClose() {
bool send=true;
if(m_opt_chkEditor){
SHELLEXECUTEINFO shex={sizeof(SHELLEXECUTEINFO)};
- shex.fMask=SEE_MASK_NOCLOSEPROCESS|SEE_MASK_NOASYNC;
+ shex.fMask=SEE_MASK_NOCLOSEPROCESS;
shex.lpVerb=_T("edit");
shex.lpFile=m_pszFile;
shex.nShow=SW_SHOWNORMAL;
ShellExecuteEx(&shex);
- WaitForSingleObject(shex.hProcess,INFINITE);
+ if(shex.hProcess){
+ WaitForSingleObject(shex.hProcess,INFINITE);
+ CloseHandle(shex.hProcess);
+ }
if(MessageBoxA(m_hWnd,"Send screenshot?","SendSS",MB_YESNO|MB_ICONQUESTION|MB_SYSTEMMODAL)!=IDYES)
send=false;
}
diff --git a/plugins/SendScreenshotPlus/src/UMainForm.h b/plugins/SendScreenshotPlus/src/UMainForm.h
index c9969234cb..8e3d0400e2 100644
--- a/plugins/SendScreenshotPlus/src/UMainForm.h
+++ b/plugins/SendScreenshotPlus/src/UMainForm.h
@@ -113,6 +113,7 @@ class TfrmMain{
RECT m_VirtualScreen;
BYTE m_opt_chkOpenAgain; //TCheckBox *chkOpenAgain;
+ BYTE m_opt_chkIndirectCapture; //TCheckBox *chkIndirectCapture;
BYTE m_opt_chkClientArea; //TCheckBox *chkClientArea;
BYTE m_opt_edtQuality; //TLabeledEdit *edtQuality;
bool m_opt_btnDeleteAfterSend; //TCheckBox *chkDeleteAfterSend;
diff --git a/plugins/SendScreenshotPlus/src/Utils.cpp b/plugins/SendScreenshotPlus/src/Utils.cpp
index fdfb29f24e..5c4cdc8162 100644
--- a/plugins/SendScreenshotPlus/src/Utils.cpp
+++ b/plugins/SendScreenshotPlus/src/Utils.cpp
@@ -73,43 +73,66 @@ BOOL CALLBACK MonitorInfoEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprc
//---------------------------------------------------------------------------
// capture window as FIBITMAP - caller must FIP->FI_Unload(dib)
-FIBITMAP* CaptureWindow (HWND hCapture, BOOL ClientArea) {
+FIBITMAP* CaptureWindow (HWND hCapture, BOOL bClientArea, BOOL bIndirectCapture) {
FIBITMAP *dib;
HWND hForegroundWin;
HDC hScrDC; // screen DC
- RECT rect; // screen RECT
+ RECT rect; // screen RECT
SIZE size; // DIB width and height = window resolution
if (!hCapture || !IsWindow(hCapture)) return 0;
hForegroundWin = GetForegroundWindow(); //Saving foreground window
SetForegroundWindow(hCapture); // Make sure the target window is the foreground one
BringWindowToTop(hCapture); // bring it to top as well
- // redraw window to prevent runtime artifacts in picture
+ /// redraw window to prevent runtime artifacts in picture
UpdateWindow(hCapture);
- GetWindowRect(hCapture,&rect);
- if(GetParent(hCapture))
- hScrDC=GetDC(hCapture);//hCapture is part of a window, capture that
- else
- hScrDC=GetWindowDC(hCapture);//entire window w/ title bar
- size.cx=ABS(rect.right-rect.left);
- size.cy=ABS(rect.bottom-rect.top);
- //capture window and get FIBITMAP
- dib = CaptureScreen(hScrDC,size,hCapture);
- ReleaseDC(hCapture,hScrDC);
- if(ClientArea){//we could capture directly, but doing so breaks GetWindowRgn() and also includes artifacts...
- RECT rectCA = {0};
- POINT pt = {0};
- GetClientRect (hCapture, &rectCA);
- ClientToScreen(hCapture, &pt);
- //crop the window to ClientArea
- FIBITMAP* dibClient = FIP->FI_Copy(dib,
- pt.x - rect.left,
- pt.y - rect.top,
- pt.x - rect.left + rectCA.right,
- pt.y - rect.top + rectCA.bottom);
+ if(bIndirectCapture){
+ intptr_t wastopmost=GetWindowLongPtr(hCapture,GWL_EXSTYLE)&WS_EX_TOPMOST;
+ if(!wastopmost)
+ SetWindowPos(hCapture,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
+ hScrDC = GetDC(NULL); /*Get full virtualscreen*/
+ size.cx = GetSystemMetrics(SM_CXVIRTUALSCREEN);
+ size.cy = GetSystemMetrics(SM_CYVIRTUALSCREEN);
+ dib = CaptureScreen(hScrDC,size);
+ ReleaseDC(hCapture,hScrDC);
+ if(bClientArea){
+ GetClientRect(hCapture,&rect);
+ ClientToScreen(hCapture,(POINT*)&rect);
+ rect.right+=rect.left; rect.bottom+=rect.top;
+ }else
+ GetWindowRect(hCapture,&rect);
+ if(rect.left<0) rect.left=0;
+ if(rect.top<0) rect.top=0;
+ if(rect.right>(long)FIP->FI_GetWidth(dib)) rect.right=FIP->FI_GetWidth(dib);
+ if(rect.bottom>(long)FIP->FI_GetHeight(dib)) rect.bottom=FIP->FI_GetHeight(dib);
+ /// crop the window to ClientArea
+ FIBITMAP* dibClient = FIP->FI_Copy(dib,rect.left,rect.top,rect.right,rect.bottom);
FIP->FI_Unload(dib);
dib = dibClient;
+ if(!wastopmost)
+ SetWindowPos(hCapture,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
+ }else{
+ GetWindowRect(hCapture,&rect);
+ if(GetAncestor(hCapture,GA_PARENT))
+ hScrDC=GetDC(hCapture);//hCapture is part of a window, capture that
+ else
+ hScrDC=GetWindowDC(hCapture);//entire window w/ title bar
+ size.cx=ABS(rect.right-rect.left);
+ size.cy=ABS(rect.bottom-rect.top);
+ /// capture window and get FIBITMAP
+ dib = CaptureScreen(hScrDC,size,hCapture);
+ ReleaseDC(hCapture,hScrDC);
+ if(bClientArea){//we could capture directly, but doing so breaks GetWindowRgn() and also includes artifacts...
+ RECT rectCA; GetClientRect(hCapture,&rectCA);
+ ClientToScreen(hCapture,(POINT*)&rectCA);
+ rectCA.left-=rect.left; rectCA.top-=rect.top;
+ rectCA.right+=rectCA.left; rectCA.bottom+=rectCA.top;
+ /// crop the window to ClientArea
+ FIBITMAP* dibClient = FIP->FI_Copy(dib,rectCA.left,rectCA.top,rectCA.right,rectCA.bottom);
+ FIP->FI_Unload(dib);
+ dib = dibClient;
+ }
}
if(hForegroundWin){//restore previous foreground window
SetForegroundWindow(hForegroundWin);
diff --git a/plugins/SendScreenshotPlus/src/Utils.h b/plugins/SendScreenshotPlus/src/Utils.h
index 59e456bde3..9fed8a737d 100644
--- a/plugins/SendScreenshotPlus/src/Utils.h
+++ b/plugins/SendScreenshotPlus/src/Utils.h
@@ -49,7 +49,7 @@ int ComboBox_SelectItemData(HWND hwndCtl, int indexStart, LPARAM data);
size_t MonitorInfoEnum(MONITORINFOEX* & myMonitors, RECT & virtualScreen);
BOOL CALLBACK MonitorInfoEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData);
-FIBITMAP* CaptureWindow(HWND hCapture, BOOL ClientArea);
+FIBITMAP* CaptureWindow(HWND hCapture, BOOL bClientArea, BOOL bIndirectCapture);
FIBITMAP* CaptureMonitor(TCHAR* szDevice);
FIBITMAP* CaptureScreen(HDC hDC, SIZE size, HWND hCapture=0);
//FIBITMAP* CaptureDesktop(); /*emulate print screen (not used)*/
diff --git a/plugins/SendScreenshotPlus/src/resource.h b/plugins/SendScreenshotPlus/src/resource.h
index 9fb928481b..b2ba2ef4c5 100644
--- a/plugins/SendScreenshotPlus/src/resource.h
+++ b/plugins/SendScreenshotPlus/src/resource.h
@@ -86,6 +86,7 @@
#define ID_gboxOptions 1603
#define ID_chkEditor 1701
#define ID_chkClientArea 1704
+#define ID_chkIndirectCapture 1705
#define ID_chkTimed 1708
#define ID_chkOpenAgain 1710
#define IDC_HEADERBAR 1734