2011-06-10 14 views
14

Görev çubuğu değiştirme, dock benzeri uygulama anahtarlayıcı stili programı uyguluyorum. OpenGL ile bazı benzersiz şeyler yapıyor ve klavye kısayollarıyla, bu şekilde ayarlandığı şekilde, pencere her zaman odaklanmıyor. Bir görev çubuğu veya bir ALT-TAB programı gibi, ön plana rasgele bir pencere getirebileceğim şekilde uygulamak istiyorum. Ancak, kodum sadece uygulama simgesinin görev çubuğunda yanıp sönmesine neden oluyor. Windows API belgeleri, bunun olması beklenen bir şey olduğunu söylüyor, ancak bu konuda çalışmak için bir yol arıyorum.Windows 7: başka bir pencerenin odak noktası ne olursa olsun pencereyi öne nasıl getirebilirsiniz?

Kodumu, aşağıdaki örneklerden uyarladım. Bu, ön plan iş parçacığına bağlanmanın ön plan penceresini ayarlamanıza izin vermesi gerektiğini söylüyor. İşte site var:

http://www.voidnish.com/Articles/ShowArticle.aspx?code=dlgboxtricks

http://invers2008.blogspot.com/2008/10/mfc-how-to-steal-focus-on-2kxp.html

Benim kod şöyle görünür. Benim pencere ön plan penceresi olmadığı sürece ki değil (Ancak

fgwin = win32gui.GetForegroundWindow() 
fg = win32process.GetWindowThreadProcessId(fgwin)[0] 
current = win32api.GetCurrentThreadId() 
if current != fg: 
    win32process.AttachThreadInput(fg, current, True) 
    win32gui.SetForegroundWindow(self.hwnd) 
    win32process.AttachThreadInput(fg, win32api.GetCurrentThreadId(), False) 

: o (self.hwnd Cepheye getirmek istiyorum pencerenin kolu olan) piton için Win32 sarmalayıcıları kullanıyor unutmayın genellikle), bu sadece programın simgesinin yanıp sönmesine neden olur.

Yanlışlıkla iş parçacığı yapıyorum? Bu konuda çalışmak için başka bir yolu var mı? Orada olması gerektiğini anladım, çünkü orada bir çok uygulama anahtarlayıcısı var, bu da bunu gayet iyi yapıyor gibi görünüyor.

Bunu python'da yazıyorum, ancak başka bir dilde bir çözüm varsa, paketleyicileri kullanacağım ya da bunu çalıştırmak için gereken her şeyi yapacağım.

Şimdiden teşekkürler!

DÜZENLEME: Sadece belirli bir bilgisayarda çalışmayı, yani, herhangi bir uygulamanın odaklanmasının bir yolu olarak, makinemde etkinleştirmenin bir yolu üzerinde çalışmasını sağlamak için bir yol açabilirim.

SOLVED: Yapmanız gereken, önalan kilidini devre dışı bırakmaktır. bu kadar kolay olduğu ortaya çıktı:

win32gui.SystemParametersInfo(win32con.SPI_SETFOREGROUNDLOCKTIMEOUT, 0, win32con.SPIF_SENDWININICHANGE | win32con.SPIF_UPDATEINIFILE) 
+2

Tamam, ancak bunu yapabilecek birçok uygulama var. Açıkça mümkün ve bana nasıl olduğunu öğreten eğiticiler buldum. Sorum şu: ders çalışmamın kodunun çalışmamasına neden olan ne yapıyorum? – jmite

+0

neden bu öğreticilerden birinden kod almıyorsunuz ve bunu –

+1

çalıştırın. Gönderdiğim kod, bir python sarıcısında, öğreticinin neredeyse tam kodudur (gönderdiğim iki bağlantıda kendiniz görün). Kimsenin kodumun neden sayfaların söylediği gibi yapmadığını ya da bunu yapmanın daha iyi bir yolu olup olmadığını söyleyip söyleyemeyeceğini soruyorum. – jmite

cevap

6

Yıllarca süren, Windows 95'e geri giden bir kodla karşılaştım. Uygulamaları sistem tepsisi simgesine çift tıklarken, uygulama pencereleri getirmek için her zaman BringWindowToTop ve SetForegroundWindow gibi Win32 API işlevlerini kullandım ön plan. Bu, Windows 7'de belirtildiği şekilde çalışmayı durdurdu, giriş pencerem diğer pencerelerin arkasına gider ve pencere çubuğu durum çubuğunda yanıp söner. Geldiğim 'etraftaki çalışma' bu; ve Windows'un tüm sürümlerinde çalışır gibi görünüyor.

//-- show the window as you normally would, and bring window to foreground. 
// for example; 
::ShowWindow(hWnd,SW_SHOW); 
::BringWindowToTop(hWnd); 
::SetForegroundWindow(hWnd); 

//-- on Windows 7, this workaround brings window to top 
::SetWindowPos(hWnd,HWND_NOTOPMOST,0,0,0,0, SWP_NOMOVE | SWP_NOSIZE); 
::SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE); 
::SetWindowPos(hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE); 
+0

Bunu en üst düzeye çıkarır, ancak klavye odağı üst penceremizde değildir. – Noitidart

1

SetForegroundWindow fonksiyonu için dokümantasyon bu aslında amaçlanan davranış olduğunu açıklıyor; süreçler odağı "çalmak" mümkün olmamalıdır. Ancak, kodunuzu yine de çalışacak şekilde ayarlamak mümkündür.

LockSetForegroundWindow düşünceler hanesine göz at: Bu

otomatik olarak kullanıcı ALT tuşuna basarsa SetForegroundWindow çağrıları sağlayan sistem açıklıyor [..]

Sen istismar edebilir

bu Programınızı yaparak davranışı, SetForegroundWindow'u aramadan önce SendInput işlevini kullanarak Alt tuşuna basmayı simüle eder.

5

NSPIRE göre, Python 2.7 ve W8 ile yaptığı çözüm denedim ve bir cazibe gibi çalışır, pencere * küçültüldüğünde bile. Pencere o küçültülmüş değilse

win32gui.ShowWindow(HWND, win32con.SW_RESTORE) 
win32gui.SetWindowPos(HWND,win32con.HWND_NOTOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE + win32con.SWP_NOSIZE) 
win32gui.SetWindowPos(HWND,win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE + win32con.SWP_NOSIZE) 
win32gui.SetWindowPos(HWND,win32con.HWND_NOTOPMOST, 0, 0, 0, 0, win32con.SWP_SHOWWINDOW + win32con.SWP_NOMOVE + win32con.SWP_NOSIZE) 
  • Başlangıçta oldu ama teşekkürler için whome 'yorumunu win32gui.ShowWindow(HWND, win32con.SW_RESTORE), şimdi tüm durumlarda çalışır.
+2

SetWindowPos işlevlerini çağırmadan önce pencereyi geri yüklemeniz gerekir. Delphi uygulamaları "Application.Restore;" kullanabilir işlevini kaldırmak için işlev. ShowWindow (tanıtıcı, SW_RESTORE) python çağrısına bakın. Sadece pencere zaten gösterilmiş olsa bile zarar vermez her zaman arayın. – Whome

9

win32gui kullanım önerilerini beğenmedim çünkü bu dosyayı pip aracılığıyla kolayca yükleyemezsiniz. İşte benim çözümüm:

İlk olarak 'u pip aracılığıyla yükleyin. Python 2.7.9 veya 2 dalında daha yeni bir sürüm kullanıyorsanız veya Python 3.4.0 veya 3 şubeden daha yeni bir sürüm kullanıyorsanız, pip zaten yüklenmiştir. Diğer herkes için Python'u güncelleyin (veya Python'un daha eski bir sürümünü çalıştırmanız gerekiyorsa, el ile karşıdan yükleyip this script yükleyebilirsiniz.)

Bunu yalnızca komut satırından çalıştırın (Python içinden değil) :

pip install pywinauto 

Sonraki, ithalat ne pywinauto dan gerekir:

SetForegroundWindow(find_window(title='taskeng.exe')) 
: Son olarak

from pywinauto.findwindows import find_window 
from pywinauto.win32functions import SetForegroundWindow 

, sadece bir gerçek çizgi

İlgili konular