Ejemplo n.º 1
0
BOOL CALLBACK MyEnumProc(HWND hWnd, LPARAM lParam)
{
	TCHAR title[500];
    ZeroMemory(title, sizeof(title));
    
    //string strTitle;
    
    GetWindowText(hWnd, title, sizeof(title)/sizeof(title[0]));
	
	if (IsAltTabWindow(hWnd) && IsWindowVisible(hWnd) && GetWindowTextLength(hWnd)>0)
	{
		_tprintf(_T("Window Found: %s\n"), title);
		string nowwindow=title;
		//cout<<"string nowwindow has value: "<<nowwindow<<endl;
		openedwindows.addwindow(nowwindow);
	}
    
    //strTitle += title; // Convert to std::string
    if(_tcsstr(title, _T("Excel")))
    {
        windowHandle = hWnd;
        return FALSE;
    }
    return TRUE;
}
Ejemplo n.º 2
0
// Callback for `EnumWindows` that lists out all window names.
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {
    WinItem witem;
    MainWindow *mainwin = (MainWindow*)lParam;
    DWORD pid;

    LPWSTR buff[1024];
    if( (IsWindowVisible(hWnd)) &&
        (IsAltTabWindow(hWnd)) &&
        ((HWND)mainwin->winId() != hWnd) )
    {
        GetWindowText(hWnd, (LPWSTR)buff, sizeof(buff));
        witem.title = QString::fromWCharArray((const LPWSTR)buff);
        witem.handle = hWnd;
        witem.num = mainwin->witems.size() + 1;
        GetWindowThreadProcessId(hWnd, &pid);
        // NOTE: This call is needed to allow access to metadata of the
        // process. If original handle is used to for metadata read attempt, it
        // will likely result in an error.
        HANDLE handle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
        // NOTE: Using `GetProcessImageFileName()` here fixes the 32/64-bit
        // error.
        if(GetProcessImageFileName(handle, (LPWSTR)buff, sizeof(buff))) {
            witem.exec = QString::fromWCharArray((const LPWSTR)buff);
            witem.exec = witem.exec.mid(witem.exec.lastIndexOf("\\") + 1);
        } else {
            witem.exec = QString("NA");
        }
        mainwin->witems.append(witem);
    }
    return TRUE;
}
Ejemplo n.º 3
0
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) {

	if (IsAltTabWindow(hwnd))
	{
		Log("EnumWindowsProc: Checking %x", hwnd);
		BOOL OnCurrentDesktop = FALSE;
		pDesktopManager->IsWindowOnCurrentVirtualDesktop(hwnd, &OnCurrentDesktop);
		if (OnCurrentDesktop)
		{
			CHAR buffer[1024] = "";
			GetWindowText(hwnd, buffer, 1024);
			Log("EnumWindowsProc: %x - %s is visible", hwnd, buffer);
			return FALSE;
		}
	}
	return TRUE;
}
void VirtualMonitorManager::Update(double frame_time) {
  switch (mStage) {
    case UpdateStage::UpdateLiveWindowsSet: {
      // this shouldn't take much time so we just do this step to completion
      mLiveHwnds.clear();
      mLiveHwnds = mScreenshotProducer->GetVisibleWindows();
      // only proceed with next stage if we have live windows
      if (mLiveHwnds.size() > 0) {
        mStage = UpdateStage::InitDeadWindowSet;
        mLiveHwndIndex = 0;
      }
      break;
    }
    case UpdateStage::InitDeadWindowSet: {
      mDeadMonitors.clear();
      // populate from existing sets
      for (auto& iter : mRootMonitors) {
        mDeadMonitors.insert(iter.first);
      }
      for (auto& iter : mChildMonitors) {
        mDeadMonitors.insert(iter.first);
      }
      mStage = UpdateStage::BlitWindows;
      break;
    }
    case UpdateStage::BlitWindows: {
      WindowID win = mLiveHwnds[mLiveHwndIndex];
      mDeadMonitors.erase(win);

      ScreenshotPtr screenshot = mScreenshotProducer->Get(win);
      if (screenshot) {
        bool is_root = IsAltTabWindow(win);
        if (is_root) {
          // make sure it exists
          if (mRootMonitors.find(win) == mRootMonitors.end()) {
            mRootMonitors[win] = std::make_shared<VirtualMonitor>(mScene, win);
          }
          auto monitor = mRootMonitors[win];

          monitor->Blit(screenshot);
        }
      }

      mLiveHwndIndex++;
      if (mLiveHwndIndex >= mLiveHwnds.size()) {
        mStage = UpdateStage::RemoveDeadWindows;
      }
      break;
    }
    case UpdateStage::RemoveDeadWindows: {
      for (WindowID win : mDeadMonitors) {
        mRootMonitors.erase(win);
        mChildMonitors.erase(win);
      }
      mStage = UpdateStage::UpdateWindowSRT;
      break;
    }
    case UpdateStage::UpdateWindowSRT: {
      float num_root_monitors = static_cast<float>(mRootMonitors.size());
      const float r = 0.5f;

      int i = 0;
      for (auto iter : mRootMonitors) {
        auto monitor = iter.second;

        monitor->UpdateScale();

        float deg = 360.0f * (i / num_root_monitors);
        float rad = deg * 3.14159f / 180.0f;
        float x = r * cos(rad);
        float y = r * sin(rad);
        monitor->SetPosition(x, 0, -y);

        monitor->FocusAtUser();

        ++i;
      }
      mStage = UpdateStage::UpdateLiveWindowsSet;
      break;
    }
  }

}