Embedded Browser -> copy to clipboard fails



  • Guten Tag zusammen.

    Mit diesem Programm wird eine URL in einem embedded Browser (IE) geöffnet, auf der der Benutzer Daten eingeben kann und diese mittels Javascript in die Zwischenablage kopieren kann.

    Leider funktioniert das kopieren in die Zwischenablage nicht.
    Auch ein normales Copy & Paste irgendwelcher Zeichen aus dem embedded Browser geht nicht.

    Wenn die URL direkt über einen Browser (IE) geöffnet wird, so klappt alles tadellos.
    Auch wenn ich eine MFC Projekt erstelle und darauf das WebBrowser Control platziere geht alles wunderbar.

    Ich vermute mal, das diese Funktion im IWebBrowser2 vorhanden sein müsste?!

    Vielen Dank für die Hilfe,
    Sotares

    #include <windows.h>
    #include <exdisp.h>
    #include "resource.h"
    
    #define ID_ICON1 1
    #define WM_ICONCLICK (WM_APP+0)
    #define HOTKEY_STRG_1 WM_USER
    
    HWND container;
    HICON hIcon;
    HINSTANCE hInst, hInstance;
    
    HINSTANCE hDLL = LoadLibrary("atl.dll");
    typedef HRESULT (WINAPI *PAttachControl)(IUnknown*, HWND,IUnknown**);
    PAttachControl AtlAxAttachControl = (PAttachControl) GetProcAddress(hDLL, "AtlAxAttachControl");
    RECT rect;
    IWebBrowser2 *pIwb;
    
    void SelectURL (char URL[100])
    {
    char cURL[100];
    strcpy(cURL, URL);
    WCHAR strBuffer[100];
    MultiByteToWideChar(CP_ACP, 0, cURL, -1, strBuffer, sizeof(strBuffer));
    pIwb->Navigate(strBuffer,0,0,0,0);
    }
    
    void Icon_in_Taskleiste (HWND hwnd, BOOL bAnzeigen); 
    
    BOOL CALLBACK AboutDlgProc (HWND, UINT, WPARAM, LPARAM);
    BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    
    	switch(message)
    	{
    	case WM_INITDIALOG:
    		return TRUE;
    
    	case WM_COMMAND:
    		switch (LOWORD (wParam))
    		{
    
    		case IDOK_ABOUT: {
    			EndDialog(hDlg,0);
    			return TRUE; }
    
    		case IDOK_EXIT: { 
    			EndDialog(hDlg,(wParam));
    			return TRUE; }
    
    		case IDCANCEL_EXIT: {
    			EndDialog(hDlg,(wParam));
    			return TRUE; }
    		}
    		break;
    
    	}
    
    	return FALSE;
    }
     /***************************************************************************/
     LRESULT CALLBACK WndProc( HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam )
     {  
    
         HMENU hMenu;
    
    	 PAINTSTRUCT ps;
    	 HDC hdc;
    	 static UINT s_uTaskbarRestart;
    
         switch(messg)
         {
    
    		case WM_CREATE:
    			{
    			hInstance = ((LPCREATESTRUCT)lParam) -> hInstance; 
    
    			if(!RegisterHotKey(hWnd, HOTKEY_STRG_1, 2,VK_F1))    
    			MessageBox(hWnd, "Fehler beim registrieren des Hotkeys!", "Error", MB_OK);
    
    			// Die Message, die das System bei Neustart der Taskleiste schickt registrieren 
    			// Damit wir den Neustart bei evtl. Absturz des Explorers mitbekommen.
    			s_uTaskbarRestart = RegisterWindowMessage (TEXT("TaskbarCreated"));
    
    			// Im Verzeichnis der EXE muss sich die Icondatei "icon.ico" befinden
    			// Wir laden es jetzt in den Speicher
    			hIcon = (HICON)LoadImage (hInst, "icon.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE);
    
    			// Aus der Resource ginge so:
    			//hIcon = (HICON) LoadImage (hInst, MAKEINTRESOURCE(IDI_ICON), IMAGE_ICON, 0, 0, LR_SHARED);
    
    			Icon_in_Taskleiste (hWnd, TRUE);
    
    			GetClientRect(hWnd,&rect);
    			container=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",WS_CHILD | WS_VISIBLE,0,0,rect.right,rect.bottom,hWnd,0,0,0);
    			CoInitialize(0);
    			CoCreateInstance(CLSID_WebBrowser,0,CLSCTX_ALL,IID_IWebBrowser2,(void**)&pIwb);
    			AtlAxAttachControl(pIwb,container,0);
    			SelectURL("http://localhost/notewriter/index.php");
    			} return 0;
    
                case WM_COMMAND:
    			hMenu = GetMenu (hWnd);
    
                switch(LOWORD (wParam))
                {
                    case ID_FORUM: {
    					SelectURL("www.someforum.cc");
    					EnableMenuItem(hMenu,ID_FORUM,MF_GRAYED);
    					EnableMenuItem(hMenu,ID_NOTE,MF_ENABLED);
    					} break;
    
    				case ID_NOTEWRITER: {
    					SelectURL("http://localhost/notewriter/index.php");
    					EnableMenuItem(hMenu,ID_FORUM,MF_ENABLED);
    					EnableMenuItem(hMenu,ID_NOTE,MF_GRAYED);
    					} break;
    
    				case ID_ABOUT: {
    					DialogBox(hInstance, TEXT("About"), hWnd, AboutDlgProc);
    					} break;
    
    				case ID_EXIT: {
    						if(DialogBox(hInst, TEXT("Exit"), hWnd, AboutDlgProc)==IDOK_EXIT)
    						{
    						SendMessage(hWnd,WM_DESTROY,0,0);
    						}
    					}
    
                }             
    
    		case WM_PAINT:
    			{
    			 hdc = BeginPaint (hWnd, &ps);
    			 EndPaint (hWnd, &ps);
    			 break;
    			}
    
    		case WM_SIZE:
                 MoveWindow(container,0,0,LOWORD(lParam), HIWORD(lParam),1);
    			 break;
    
    		//Nachricht bei Mausaktionen auf dem Icon in der Taskbar
    		case WM_ICONCLICK:
    			switch(lParam)
    			{
    			case WM_LBUTTONUP: // linke Maustaste
    			Icon_in_Taskleiste(hWnd,0);
    			ShowWindow (hWnd, 1) ;
                break;
    			}
            return 0;
    
    		case WM_HOTKEY: 
    			switch (wParam) 
    			{ 
    				case HOTKEY_STRG_1: 
    				Icon_in_Taskleiste(hWnd,0);
    				if(ShowWindow(hWnd, SW_SHOW))
    				{
    				Icon_in_Taskleiste(hWnd,1);
    				ShowWindow (hWnd, SW_HIDE);
    				}
    			}
    			break;
    
    		case WM_CLOSE:
                 if(DialogBox(hInst, TEXT("Exit"), hWnd, AboutDlgProc)==IDOK_EXIT)
    						{
    						SendMessage(hWnd,WM_DESTROY,0,0);
    						}
                 break;
    
    		case WM_DESTROY:
    			 DestroyWindow(hWnd);
    			 Icon_in_Taskleiste (hWnd, FALSE); // Icon aus der Taskleiste entfernen
    			 DestroyIcon (hIcon); // Speicher freigeben
                 PostQuitMessage( 0 );
                 break;
    
    		case WM_SYSCOMMAND:
    			if (wParam==SC_MINIMIZE)
    			{
    			Icon_in_Taskleiste(hWnd,1);
    			ShowWindow (hWnd, SW_HIDE);
    			return 0;
    			}
    
            default:
    			 // Wurde die Taskleiste zwischendurch neu gestartet?
    			 if (messg == s_uTaskbarRestart)
    			 Icon_in_Taskleiste (hWnd, TRUE); // Icon in die Taskleiste setzen
                 return( DefWindowProc( hWnd, messg, wParam, lParam ) );
         }
         return 0;
    
     /***************************************************************************/
     }
     /********************* Funktion WinMain ************************************************/
     int WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPreInst,LPSTR lpszCmdLine, int nCmdShow )
     {
    	 char szAppName[]=TEXT("NoteWriter");
         WNDCLASS wc;
         char NomClasse[] = "container";
         wc.style = CS_HREDRAW | CS_VREDRAW;
         wc.lpszClassName    = NomClasse;
         wc.hInstance        = hInst;
         wc.lpfnWndProc     = WndProc;
         wc.hCursor            = LoadCursor( 0, IDC_ARROW );
         wc.hIcon            = LoadIcon( hInst, MAKEINTRESOURCE (IDI_ICON));
         wc.lpszMenuName    = MAKEINTRESOURCE(IDR_MENU1);
         wc.hbrBackground    = 0;
         wc.style            = 0;
         wc.cbClsExtra        = 0;
         wc.cbWndExtra        = 0;
    
         if (!RegisterClass(&wc)) return 0;
    
         HWND hWnd = CreateWindow(
             NomClasse,
             szAppName,
             WS_SYSMENU|
             WS_THICKFRAME|
             WS_MINIMIZEBOX,
             0,0,800,700,0,NULL,hInst,0);
    
    	 ShowWindow (hWnd, SW_HIDE) ;
         UpdateWindow( hWnd );
    
         MSG Msg;
         while( GetMessage(&Msg, 0, 0, 0))
         {
             TranslateMessage( &Msg );
             DispatchMessage( &Msg );
         }
    
         pIwb->Release();
         CoUninitialize();        
         FreeLibrary(hDLL);
         return( Msg.wParam);
     }
    
    //Hier ist die Funktion zum Anzeigen und Entfernen des Icons.
    void Icon_in_Taskleiste (HWND hwnd, BOOL bAnzeigen)
    {
        NOTIFYICONDATA tsym; // in diese Struktur kommen die Daten des Icons
    
        ZeroMemory (&tsym, sizeof (NOTIFYICONDATA));
    
        if (bAnzeigen)
        {
            tsym.cbSize = sizeof (NOTIFYICONDATA);
            tsym.hWnd   = hwnd;
            tsym.uID    = ID_ICON1;
            tsym.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
            tsym.uCallbackMessage = WM_ICONCLICK;
            tsym.hIcon  = hIcon;
            strcpy (tsym.szTip, "NoteWriter");
            Shell_NotifyIcon (NIM_ADD, &tsym);
        }
    
        else
        {
            tsym.cbSize = sizeof (NOTIFYICONDATA);
            tsym.hWnd   = hwnd;
            tsym.uID    = ID_ICON1;
            tsym.uFlags = 0;
            Shell_NotifyIcon (NIM_DELETE, &tsym);
        }
            return;
    }
    


  • Kopierst du mit Maus oder mit Tastatur?



  • Ich kopiere es mit der Maus.
    Aber weder mit der Maus oder der Tastatur funktioniert das kopieren.
    Auf jeder Seite die ich bis jetzt aufgerufen habe funktioniert Copy & Paste nicht.
    Auf Tastatur -und Mauseingaben reagiert der embedded Browser aber ohne Probleme.

    freundlichst,
    Sotares



  • wenns mit der tastatur gewesen wäre, dann hätte es daran liegen können, dass der ie so nicht alle Tastatur Events richtig bekommt (wahrscheinlich kannst du nicht mit Tab in andere Felder springen), aber so hab ich auch keine Idee. Musst halt mal googlen (am besten auf englisch)



  • Richtig, Tab funktioniert ebenfalls nicht.
    Google gehört zu meinem Hilfsmittel Nr. 1 🙂

    Leider habe ich keine Ideen mehr, was ich noch tun könnte...

    Sotares



  • das mit Tab geht, wenn du dir das IOleInPlaceActiveObject Inteface vom bowser holst und dann TranslateAccelerator bie der Message verarbeitung aufrufst, ob das bei copy und paste auch hilft weiß ich nciht.



  • Danke für den Hinweis mit dem IOleInPlaceActiveObject und dem TranslateAccelerator.

    Irgendwie werde ich aber nicht schlau daraus. :xmas2:
    Hast Du mir dazu vielleicht ein Beispiel?

    Ich habe in diesem Forum noch ein anderes Code Fragment gefunden, dass mich ein Stück weiter gebracht hat.

    void CopyData(HWND hwnd);
    char pszData[]="Test";
    
    LRESULT CALLBACK WndProc(....)
     {  
    
         switch(messg)
         {
            case WM_LBUTTONDOWN:
    		{
    		CopyData(hWnd); 
    		}
         }
    }
    
    void CopyData(HWND hWnd)
     {
    
      HGLOBAL hData;
      LPVOID pData;
    
      OpenClipboard(hWnd);
      EmptyClipboard();
      hData = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE,strlen(pszData) + 1);
      pData = GlobalLock(hData);
      strcpy((LPSTR)pData, pszData);
      GlobalUnlock(hData);
      SetClipboardData(CF_TEXT, hData);
      CloseClipboard();
     }
    

    Beim drücken der linken Maustaste im Menu, wird der Text "Test" in die Zwischenablage kopiert.

    Wenn dies jetzt nur noch funktioniert, wenn ich im WebBrowser (container) etwas kopiere, dann ist für mich schon Weihnachten! 🙂

    Sotares



  • So, ich habs hingekriegt dass die Tabulator und Delete Taste soweit nun funktioniert. Die Copy & Paste Funktion geht nachwievor nicht.

    In der Message Routine:

    if(Msg.message == WM_KEYDOWN)
    		 {
    			IOleInPlaceActiveObject* pIOIPAO;
    			HRESULT hr =  pIwb->QueryInterface (IID_IOleInPlaceActiveObject, (void**)&pIOIPAO);
    			hr = pIOIPAO->TranslateAccelerator(&Msg);
    			pIOIPAO->Release();
    		 }
    

    Grüsse,
    Sotares

    Ist inzwischen ein Crossposting zu
    http://www.softgames.de/forum/viewtopic.php?p=698502#698502
    Bitte keine Flames 😉


Log in to reply